Javascript—基于过滤器对象中任何深度的属性过滤对象数组的通用解决方案

Javascript—基于过滤器对象中任何深度的属性过滤对象数组的通用解决方案,javascript,arrays,filter,Javascript,Arrays,Filter,如何基于过滤器对象中普遍存在的任何深度的属性过滤对象列表,而不事先知道属性的名称 给出以下示例列表: var list = [ { name: 'Alice', address: { zip: '10000', street: '71 Pilgrim Avenue' } }, { name: 'Bob', address: { zip: '20000', street: '44 Shirley Ave' } }, { name: 'Charlie', address: { zip: '30000

如何基于过滤器对象中普遍存在的任何深度的属性过滤对象列表,而不事先知道属性的名称

给出以下示例列表:

var list = [
{ name: 'Alice', address: { zip: '10000', street: '71 Pilgrim Avenue' } },
{ name: 'Bob', address: { zip: '20000', street: '44 Shirley Ave' } },
{ name: 'Charlie', address: { zip: '30000', street: '4 Goldfield Rd' } },
]
如果我有以下筛选器对象,我希望返回数组中与此筛选器匹配的对象

var filter = {
 address: { zip: '10000' }
}
在这种情况下,报税表应为:

[{ name: 'Alice', address: { zip: '10000', street: '71 Pilgrim Avenue' } }]
我试图用Object.keys()函数迭代对象的属性,但问题是Object.keys函数不仅返回属性,还返回作为数组的属性值


编辑:使用另一个字段更新示例日期,以明确任何级别都可以有多个属性。

您可以编写一个递归函数,检查一个对象是否“包含”另一个对象:


我假设您正在筛选的对象只能包含可以直接比较的“普通”嵌套对象或基本值。如果可以使用更复杂的值(如数组),则需要在
compare
函数中添加更多的事例。

对象
。keys
函数只返回键,不返回值。如果你有一个简单的可复制的例子,说明它不是这样做的,请把它添加到问题中。这是我能想到的最简单的Object.keys()行为示例:-由于这种行为,我无法编写迭代对象所有级别的函数。
const compare = r => l => (typeof l === "object" ? contains(r)(l) : l === r);
const contains = r => l =>
  Object.keys(r).every(k => l.hasOwnProperty(k) && compare(r[k])(l[k]));

var list = [
  {
    name: "Alice",
    address: {
      zip: "10000"
    }
  },
  {
    name: "Bob",
    address: {
      zip: "20000"
    }
  },
  {
    name: "Charlie",
    address: {
      zip: "30000"
    }
  }
];

var filter = {
  address: { zip: "10000" }
};

console.log(list.filter(contains(filter)));
// [{"name":"Alice","address":{"zip":"10000"}}]