首页 > 解决方案 > 为什么你是(Javascript算法挑战)

问题描述

问题

创建一个函数,它查看对象数组(第一个参数)并返回一个包含匹配名称和值对的所有对象的数组(第二个参数)。如果要包含在返回的数组中,源对象的每个名称和值对都必须存在于集合中的对象中。

例如,如果第一个参数是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }],第二个参数是 { last: "Capulet" },那么您必须从数组中返回第三个对象(第一个参数),因为它包含名称及其值,作为第二个参数传递。

我的尝试

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" });

我的问题

我真的很难遍历对象并同时找到相关的键和值。似乎某些函数不像对数组那样对对象起作用。

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

标签: javascriptalgorithmobject

解决方案


几个问题:

  • (source[item])> 0是一个布尔表达式,所以你实际上是在做.indexOf(true)or .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);

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


推荐阅读