首页 > 解决方案 > 与参数匹配时返回对象的键和值

问题描述

目的是构建一个函数,它将一个对象数组作为第一个参数。作为第二个参数,它需要一个键值对。

function whatIsInAName(collection, source)

现在该函数应该返回一个包含对象中所有匹配键和值的数组。例如:

whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })´ 

应该返回

[{ first: "Tybalt", last: "Capulet" }]

whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 })

应该返回

 [{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }]

我尝试遍历集合并通过源数组搜索匹配项。像这样:

function whatIsInAName(collection, source) {
  // What's in a name?
  var arr = [];
  for (var i = 0; i < Object.keys(collection).length; i++) {
    for (var j = 0; j < Object.keys(source).length; j++) {
      if (collection[i].last === source.last) {
        arr.push(collection[i]);
      }
    }
  }
  console.log(arr);
}

如果出现这种论点whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })

这并不奇怪。

我不明白的是,为什么我不能概括上述解决方案,以便它在其他情况下也适用。

为什么不能简单地给出条件:

if (collection[i] === source)

Last"(请注意收集和来源后面缺少的“键。)

当我console.log(source),控制台记录它。所以恕我直言,上面的条件语句应该可以工作,并且应该将匹配项推送到arr数组中。

如何构建一个函数,该函数返回一个包含对象中所有匹配键和值的数组。

 function whatIsInAName(collection, source)

为什么(collection[i] === source) 不起作用?

谢谢你。

标签: javascriptarraysobjectmatching

解决方案


您需要迭代键/值对并返回过滤结果。

实际上,没有内置方法可以针对另一个对象测试对象以检查对象是否包含子对象。

function whatIsInAName(collection, source) {
    var pairs = Object.entries(source);
    return collection.filter(object => pairs.every(([key, value]) => object[key] === value));
}

console.log(whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }));
console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 }));
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读