首页 > 解决方案 > 基于键/值对的 Filer 对象数组

问题描述

我正在创建一个函数,它接受第一个参数,一个对象数组,并将其与第二个参数(一个对象)进行比较,以查看键/值对是否匹配。该函数将返回包含匹配键/值对的对象。我同时使用filter, 和hasOwnProperty键进行比较,如下所示:

function whatIsInAName(collection, source) {
var result = collection.filter(el => {
return el == Object.keys(el).hasOwnProperty(Object.keys(source)) === true;
});
}
return result;

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

在上面的示例中,函数将返回{ first: "Tybalt", last: "Capulet" }

我正在过滤第一个参数并将键与第二个参数进行比较,试图返回两个对象的键进行比较,但是我很困惑这应该如何工作。即,如果这是解决方案所需要的,我将如何比较除了键之外的值?我确实知道还有其他方法可以得到答案,但我想掌握hasOwnProperty我的逻辑哪里出了问题。谢谢你。

标签: javascriptfilterhasownproperty

解决方案


相反,迭代entrieseach elcollection这样您就可以一次测试每个键和关联的值。hasOwnProperty检查完全是多余的:

function whatIsInAName(collection, source) {
  const [[findKey, findVal]] = Object.entries(source);
  return collection.filter(el => (
    Object.entries(el).some(([key, val]) => (
      key === findKey && val === findVal
    )
  )))
}
console.log(
  whatIsInAName([{
    first: "Romeo",
    last: "Montague"
  }, {
    first: "Mercutio",
    last: null
  }, {
    first: "Tybalt",
    last: "Capulet"
  }, {
    first: "another",
    last: "Capulet"
  }, {
    first: "Tybalt",
    last: "notACapulet"
  }], {
    last: "Capulet"
  })
);


推荐阅读