Me gustaría encontrar la forma más eficiente de buscar un objeto, donde cada valor es una matriz de matrices. La función de búsqueda recibiría una matriz [0,1,0] , encontraría todos los elementos que contienen esta matriz y devolvería una matriz de claves coincidentes.
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]] }por ejemplo
[0,0,0] devolvería ["bob","joe","ike"][0,1,0] devolvería ["bob","joe"][1,1,1] devolvería ["joe","ike"][0,0,2] devolvería ["ike"]Esto obtendrá el resultado que desea, pero puede que no sea el más eficiente en términos de velocidad. Aunque es corto.
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], ], }; const test = (items, target) => { return Object.entries(items) .filter((item) => { return item[1].some((list) => { return ( list.length === target.length && list.every((number, index) => { return number === target[index]; }) ); }); }) .map((item) => { return item[0]; }); }; console.log(test(items, [0, 0, 0])); // [ 'bob', 'joe', 'ike' ] console.log(test(items, [0, 1, 0])); // [ 'bob', 'joe' ] console.log(test(items, [1, 1, 1])); // [ 'joe', 'ike' ] console.log(test(items, [0, 0, 2])); // [ 'ike' ] Explicación : utilice Object.entries() para obtener las claves y los valores de items . Luego filtre esa lista usando la función some , donde tiene que haber alguna matriz en la lista de valores donde la matriz es igual a la matriz de destino. En este caso, para ver si las matrices son iguales, verifiqué que las longitudes fueran iguales y que todos los números fueran iguales usando every . Después de filtrar la lista de entradas, usamos el map para obtener los nombres.
Usando Object#keys y Array#reduce , itere sobre las claves del objeto. En cada propiedad, cree un hash a partir de su valor, luego, usando Object#hasOwnProperty , verifique si el subarreglo de destino está en él, lo que determinará si se incluye o no la clave actual en la lista resultante:
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() );