簡體   English   中英

Javascript-基於過濾對象中存在的任何深度的屬性來過濾對象數組的通用解決方案

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM