【问题标题】:Wherefore art thou (Javascript Algorithm Challenge)为什么你是(Javascript算法挑战)
【发布时间】:2020-04-29 13:00:23
【问题描述】:

问题

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

例如,如果第一个参数是 [{ 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" });

我的问题

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

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

【问题讨论】:

  • Object.entries(obj) 为您提供 obj 的键/值对数组。
  • indexOf 周围的括号也弄乱了,这条线不会像你想象的那样做。
  • 你如何变回一个对象?
  • @AndrewNeedsHelp 您实际上不需要改回对象。你仍然只需要filtercollection,那部分代码是对的。但是接下来,你需要loop through source查看它的所有属性是否都在当前item
  • 所以只是括号有问题吗?如果是这样,它们应该如何? @Bergi

标签: javascript algorithm object


【解决方案1】:

几个问题:

  • (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);

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

【讨论】:

  • 这很有趣,所以如果你像这里一样输入 [key, value]。然后您可以同时遍历您创建的数组的两侧(使用 Object.entries())!?我不知道这是可能的
  • function whatIsInAName(collection, source) { var arr = []; for(let [key, value] of Object.entries(collection)){ let filteredEntries = [key, value].filter((item)=>{ return item.key == source.key && item.value == source .value }) arr.push(filteredEntries); } 返回 arr; } - 你的解决方案很完美,我尝试了一个变体,但似乎不起作用。如果您对可能出现的问题有深入了解,我们将不胜感激
  • [key, value].filter 将使用 2 个值过滤该新数组:键和值。那不是你想要的 ;-)