DEV Community

miku86
miku86

Posted on

5

JavaScript Data Structures: Hash Table: Get all entries

Intro 🌐

Last time, we learned how to get the values from our hash table.

Today, we'll learn how to get the whole entries (= all key-value pairs) of our Hash Table.


Requirements πŸ’­

We need the following parts to get the values from our Hash Table:

  • a method to get the entries (entries)

Starter Code ▢️

We start with the code with the set method, so that we can use the set method to add some data.

class Hashtable {
  constructor() {
    this.data = [];
    this.size = 0;
  }

  hash(key) {
    const chars = key.split("");
    const charCodes = chars.map((char) => char.charCodeAt());
    const charCodeSum = charCodes.reduce((acc, cur) => acc + cur);
    return charCodeSum;
  }

  set(key, value) {
    const hash = this.hash(key);

    if (!this.data[hash]) {
      this.data[hash] = [];
    }

    this.data[hash].push([key, value]);

    this.size++;
  }
}
Enter fullscreen mode Exit fullscreen mode

If you are not familiar with the hash function, re-read this post.


Thoughts πŸ’­

First, we should think about the constraints and possibilities:

  • first, we declare an empty array for the entries
  • then we iterate over the data array
  • if there is data (= array of key-value pairs) at this specific index, iterate over this data (= the single key-value pairs)
  • add the data (= key-value pair) to the entries array
  • return the entries array

As you can see, the steps are nearly the same as in our keys function and values function


Example

We want to get all the entries.

// current hash table data:
[
  [["age", 33]],
  [
    ["name", "miku86"],
    ["mean", false],
  ],
];

// desired data:
[
  ["age", 33],
  ["name", "miku86"],
  ["mean", false],
];
Enter fullscreen mode Exit fullscreen mode

Steps

// current hash table data:
[
  [["age", 33]],
  [
    ["name", "miku86"],
    ["mean", false],
  ],
];

// then we iterate over the data array
[["age", 33]];

// if there is data (= array of key-value pairs) at this specific index
// then iterate over this data (= the single key-value pairs)
["age", 33];

// add the data (= key-value pair) to the entries array
[["age", 33]];

// then we iterate over the data array
[
  ["name", "miku86"],
  ["mean", false],
];

// if there is data (= array of key-value pairs) at this specific index
// then iterate over this data (= the single key-value pairs)
["name", "miku86"];

// add the data (= key-value pair) to the entries array
[
  ["age", 33],
  ["name", "miku86"],
];

// if there is data (= array of key-value pairs) at this specific index
// then iterate over this data (= the single key-value pairs)
["mean", false];

// add the data (= key-value pair) to the entries array
[
  ["age", 33],
  ["name", "miku86"],
  ["mean", false],
];

// desired data:
[
  ["age", 33],
  ["name", "miku86"],
  ["mean", false],
];
Enter fullscreen mode Exit fullscreen mode

βœ…


Implementation β›‘

// a Hash Table class
class Hashtable {
  constructor() {
    this.data = [];
    this.size = 0;
  }

  hash(key) {
    const chars = key.split("");
    const charCodes = chars.map((char) => char.charCodeAt());
    const charCodeSum = charCodes.reduce((acc, cur) => acc + cur);
    return charCodeSum;
  }

  set(key, value) {
    const hash = this.hash(key);

    if (!this.data[hash]) {
      this.data[hash] = [];
    }

    this.data[hash].push([key, value]);

    this.size++;
  }

  entries() {
    // declare an empty array for the entries
    const entries = [];

    // iterate over the data array (I call a single array a "bucket")
    for (let bucket of this.data) {
      // if there is data (= array of key-value pairs) at this specific index
      if (bucket) {
        // iterate over this data (= the single key-value pairs)
        for (let item of bucket) {
          // add the data (= key-value pair) to the entries array
          entries.push(item);
        }
      }
    }

    // return the entries array
    return entries;
  }
}
Enter fullscreen mode Exit fullscreen mode

Note: I'm using a for ... of-loop. If you don't know how this works, you can read about it on MDN. You can use whatever you want to use, a default for-loop, a for ... in-loop, a functional approach etc.


Result

// create a new hash table
const newHashtable = new Hashtable();

// add three new key-value pairs
newHashtable.set("name", "miku86");
newHashtable.set("mean", false);
newHashtable.set("age", 33);

// show the hash table data
console.log(newHashtable.data);
// [ <301 empty items>, [ [ 'age', 33 ] ], <115 empty items>, [ [ 'name', 'miku86' ], [ 'mean', false ] ] ]

// show the entries
console.log(newHashtable.entries());
// [['age', 33], ['name', 'miku86'], ['mean', false]] βœ…
Enter fullscreen mode Exit fullscreen mode

βœ…

Next Part ➑️

We managed to write a function to get all entries, great work!

As you can see, most of the logic was nearly the same as in our keys function and values function.

Next time, we'll recap the Hash Table!

Need some mentoring? Click here!


Further Reading πŸ“–


Questions ❔

  • How would you implement the entries-function?
  • Is there an alternative to our current approach, e.g. using already existing methods like get?
  • How would you write this code in a functional style?

Top comments (0)

typescript

11 Tips That Make You a Better Typescript Programmer

1 Think in {Set}

Type is an everyday concept to programmers, but it’s surprisingly difficult to define it succinctly. I find it helpful to use Set as a conceptual model instead.

#2 Understand declared type and narrowed type

One extremely powerful typescript feature is automatic type narrowing based on control flow. This means a variable has two types associated with it at any specific point of code location: a declaration type and a narrowed type.

#3 Use discriminated union instead of optional fields

...

Read the whole post now!

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay