Tengo que hacer una función que mire a través de una matriz de objetos (primer argumento) y devuelva una matriz de todos los objetos que tienen pares de nombre y valor coincidentes (segundo argumento). Cada par de nombre y valor del objeto de origen debe estar presente en el objeto de la colección si se va a incluir en la matriz devuelta.
Mi solución pasa todas las comprobaciones además de esta: whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c" : 3}) debe devolver []. Y me pregunto por qué la función devuelve la matriz dada en lugar de una vacía. Y si hay una manera de hacer que mi función funcione eventualmente. Mi código estará debajo. ¡GRACIAS POR AYUDAR!
function whatIsInAName(collection, source) { let arr = []; const sourceKeys = Object.keys(source); for (let key in sourceKeys) { arr = collection.filter( obj => (Object.keys(obj).length >= sourceKeys.length) ? obj.hasOwnProperty(sourceKeys[key]) && obj[sourceKeys[key]] === source[sourceKeys[key]] : 0); } return arr; } whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c": 3});Podría crear una implementación simple usando Object.keys() y Array.every() .
Esto significa que cada elemento devuelto debe incluir cada clave y valor de la fuente, pero puede incluir claves y valores adicionales:
function whatIsInAName(collection, source) { return collection.filter(obj => Object.keys(source).every(key => obj[key] === source[key])); } console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c": 3})); console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 2, "c": 3})); console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3, "d": 4 }], {"a": 1, "b": 2, "c": 3})); console.log(whatIsInAName([{"a": 1, "c": 3, "d": 4 }], {"a": 1, "b": 2, "c": 3})); .as-console-wrapper { max-height: 100% !important; top: 0; }Lo siguiente debería funcionar:
function fltArr(collection, p) { const tst=Object.entries(p); return [...collection].filter(o=> tst.every(([k,v])=>o[k]==v)) // check for each key and value of p } // that they are the same in o[k] const arr=[{a: 1, b: 2, c:3, d:7},{a: 1, b: 2, d: 3}], patterns=[{a: 1, b: 9999, c: 3},{a: 1, b: 2, c: 3},{a: 1, b: 2, d: 3}]; patterns.forEach(p=>console.log(fltArr(arr,p))) Según entiendo la pregunta, el objeto de colección puede tener propiedades adicionales ( no especificadas en p ) y aún así ser una coincidencia. Por esta razón, el primer elemento coincide con el segundo patrón de prueba.