Skip to content
Advertisement

How to find matching keys in an object where each key’s value is an array of arrays?

I would like to find the most efficient way to search an object, where each value is an array of arrays. The search function would recieve an array [0,1,0], find all items that contain this array, and return an array of matching keys.

var items = {
  "bob":[[0,0,0],[0,0,1],[0,1,0]],
  "joe":[[0,0,0],[1,1,1],[0,1,0]],
  "ike":[[0,0,0],[0,0,2],[1,1,1]]
}

for example

  • [0,0,0] would return ["bob","joe","ike"]
  • [0,1,0] would return ["bob","joe"]
  • [1,1,1] would return ["joe","ike"]
  • [0,0,2] would return ["ike"]

Advertisement

Answer

Using Object#keys and Array#reduce, iterate over the keys of the object. In every property, create a hash from its value, then using Object#hasOwnProperty, check if the target subarray is in it, which will determine whether to include the current key or not in the resulting list:

const getMatchingProps = (obj = {}, subArr = []) => 
  Object.keys(obj).reduce((matchingKeys, key) => {
    const hash = obj[key].reduce((acc, arr, i) => ({ ...acc, [arr]: i }), {});
    return hash.hasOwnProperty(subArr) ? [...matchingKeys, key] : matchingKeys
  }, []);

const items = {
  "bob": [[0,0,0],[0,0,1],[0,1,0]],
  "joe": [[0,0,0],[1,1,1],[0,1,0]],
  "ike": [[0,0,0],[0,0,2],[1,1,1]]
};

console.log( getMatchingProps(items, [0,0,0]).join() );
console.log( getMatchingProps(items, [0,1,0]).join() );
console.log( getMatchingProps(items, [1,1,1]).join() );
console.log( getMatchingProps(items, [0,0,2]).join() );
User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement