Eze*_*eon 2 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', street: '4 Goldfield Rd' } },
]
Run Code Online (Sandbox Code Playgroud)
如果我有以下过滤器对象,我想返回数组中与该过滤器匹配的对象。
var filter = {
address: { zip: '10000' }
}
Run Code Online (Sandbox Code Playgroud)
这种情况下的返回应该是:
[{ name: 'Alice', address: { zip: '10000', street: '71 Pilgrim Avenue' } }]
Run Code Online (Sandbox Code Playgroud)
我尝试使用 Object.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"}}]
Run Code Online (Sandbox Code Playgroud)
我假设您正在过滤的对象只能包含可以直接比较的“普通”嵌套对象或原始值。如果您可以拥有更复杂的值(例如数组),则需要在函数中添加更多情况compare。
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |