[英]Javascript - generic solution to filter an array of objects based on properties of any depth present in a filter object
如何在不事先知道屬性名稱的情況下,基於一般存在於過濾對象中的任何深度的屬性來過濾對象列表?
給定以下示例列表:
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函數不僅返回屬性,而且還以數組形式返回屬性值。
編輯:使用另一個字段更新了示例日期,以明確說明任何級別都可以具有多個屬性。
您可以編寫一個遞歸函數來檢查一個對象是否“包含”另一個對象:
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"}}]
我假設您要過濾的對象只能包含可以直接比較的“普通”嵌套對象或原始值。 如果可以使用數組等更復雜的值,則需要在compare
函數中添加更多的compare
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.