你为什么(Javascript算法挑战)



问题

生成一个函数,该函数遍历对象数组(第一个参数(,并返回具有匹配名称和值对的所有对象的数组(第二个参数(。如果要将源对象的每个名称和值对包括在返回的数组中,则该对象必须存在于集合中的对象中。

例如,如果第一个参数是[{first:"Romeo",last:"Montague"},{first:"Mercutio",last:null},{first:"Tybalt",last:"Capulet"}],而第二个参数是{last:"Capuleet"}则必须返回数组中的第三个对象(第一个参数(,因为它包含名称及其值,该名称及其值作为第二个自变量传递。

我的尝试

function whatIsInAName(collection, source) {
let filteredCollection = collection.filter((item)=>{
return collection[item].indexOf((source[item])> 0);
})
return filteredCollection;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" });

我的问题

我真的很难在遍历对象的同时找到相关的键和值。某些函数似乎不能像处理数组那样处理对象。

非常感谢您在解决此代码问题方面的帮助?

几个问题:

  • (source[item])> 0是一个布尔表达式,所以实际上是在做.indexOf(true).indexOf(false),这两个都没有意义
  • indexOf可以在数组中找到给定的对象,但它不能用来找到满足某些条件的数组元素,这正是您想要的。你应该使用另一种方法
  • 第二个参数可能有几个必须匹配的属性,因此您需要一个循环来迭代这些属性。您的代码中没有这样的循环

你可以这样做:

function whatIsInAName(collection, source) {
let filteredCollection = collection.filter((item) => {
return Object.entries(source).every(([key, value]) => {
return item[key] === value;
});
});
return filteredCollection;
}
let result = whatIsInAName([{ first: "Romeo", last: "Montague" }, 
{ first: "Tybalt", last: "Capulet" }], 
{ last: "Capulet" });
console.log(result);

请注意,您可以使用较短的箭头函数语法,其中没有代码块,只有一个表达式。

最新更新