Estoy creando una función que mira a través de una matriz del primer argumento y devuelve una matriz con todos los objetos que coinciden con el segundo argumento. No sé qué está mal con mi código o cómo solucionarlo. te lo agradeceria si me puedes ayudar
function whatIsInAName(collection, source) { const arr = []; // Only change code below this line for (let i=0; i<collection.length; i++) { if (source.hasOwnProperty(collection[i])) { arr.push(collection[i]) } } // Only change code above this line return arr; } whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });Supongo que solo desea hacer coincidir el last campo en un objeto.
function whatIsInAName(collection, source) { return collection.filter(({ last }) => last === source.last); } const result = whatIsInAName( [ { first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }, ], { last: "Capulet" } ); console.log(result); Aquí solo estamos usando un método de filtro en la matriz de colección. El predicado de la función ( ({ last }) => last === source.last ) que estamos pasando en el filtro recibirá cada objeto de la colección y comprobará si source.last === received.last .
Es igual a la siguiente:
function doesMatch(receivedObject) { if(receivedObject.last === source.last) return true; else return false; }Esta es la razón por la que source.hasOwnProperty no funciona como se esperaba:
Si ejecuta console.log , verá que está recorriendo los elementos de la collection que son objects .
Ejemplo:
function whatIsInAName(collection, source) { const arr = []; // Only change code below this line for (let i=0; i<collection.length; i++) { console.log(collection[i]); if (source.hasOwnProperty(collection[i])) { arr.push(collection[i]) } } // Only change code above this line return arr; } whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }); Pero lo que realmente quiere hacer (si está verificando las propiedades, también conocidas como claves ) es recorrer las keys en cada object .
Para eso, necesitas un segundo bucle dentro del primero.
object elementskeys en cada object elementÚtilmente, puedes usar:
Object.keys() para devolver una matriz de object keys (para cada objeto) para recorrer.
Por lo tanto, su segundo ciclo puede ser otro for loop .
Ejemplo:
function whatIsInAName(collection, source) { const arr = []; // Only change code below this line for (let i=0; i<collection.length; i++) { // Object Keys to Loop Through let myKeys = Object.keys(collection[i]); // Object Values let myValues = Object.values(collection[i]); for (let j = 0; j < myKeys.length; j++) { if ((source.hasOwnProperty(myKeys[j])) && (source[myKeys[j]] === myValues[j])) { arr.push(collection[i]) } } } console.log(arr); // Only change code above this line return arr; } whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });Este es el error:
if (source.hasOwnProperty(collection[i])) { // ^ collection[i] is an object, not a property Puede ser una idea usar Array.filter aquí. Algo como:
const whatIsInAName = (collection, source) => { // compare for all keys keys in [source] const compare = (obj1, obj2, keys) => keys.filter( k => obj1[k] === obj2[k] ).length > 0; // filter using comparison method return collection.filter( r => compare(source, r, Object.keys(source)) ); }; const collection2CompareTo = [ { first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }]; // expect: [{ first: "Tybalt", last: "Capulet" }], const c1 = whatIsInAName(collection2CompareTo, { last: "Capulet" }); // expect: [{ first: "Romeo", last: "Montague" }] const c2 = whatIsInAName(collection2CompareTo, { first: "Romeo" }); // expect: [{ first: "Romeo", last: "Montague" }] const c3 = whatIsInAName(collection2CompareTo, { first: "Romeo", last: "Montague" }); // expect: [] const c4 = whatIsInAName(collection2CompareTo, { first: undefined, last: "Void" }); document.querySelector(`pre`).textContent = `c1: ${ JSON.stringify(c1, null, 2)}\nc2: ${ JSON.stringify(c2, null, 2)}\nc3: ${ JSON.stringify(c3, null, 2)}\nc4: ${ JSON.stringify(c4, null, 2)}`; <pre></pre>