簡體   English   中英

按字符串數組過濾對象數組

[英]Filter array of objects by array of strings

我的 Object:

const searchFor = ['appInfo', 'questions'];

我的數據:

const data = [
  { id: '1', data: 'jobInfo' },
  { id: '2', data: 'appInfo' },
  { id: '3', data: 'documents' },
  { id: '4', data: 'questions' },
];

我期待最終的結果是:

[
  { id: '2', data: 'appInfo' },
  { id: '4', data: 'questions' },
];

我的嘗試是我可以過濾一個具有固定值的項目

const result = Object.keys(searchFor).map((key) => data.filter((obj) => obj.data === key))

我得到array of arrays但我需要array of object我不確定是否有更好的方法來做到這一點。

提前致謝:)

您可以將Array.prototype.filter()Array.prototype.includes() ) 一起使用:

 const searchFor = ['appInfo', 'questions'], data = [{id:'1',data:'jobInfo'},{id:'2',data:'appInfo'},{id:'3',data:'documents'},{id:'4',data:'questions'},], result = data.filter(({data:d}) => searchFor.includes(d)) console.log(result)
 .as-console-wrapper{min-height:100%;}

您可以將Map用於密鑰/對象對,將 map 用於找到的對象。

 const searchFor = ['appInfo', 'questions'], data = [{ id: '1', data: 'jobInfo' }, { id: '2', data: 'appInfo' }, { id: '3', data: 'documents' }, { id: '4', data: 'questions' }], result = searchFor.map( Map.prototype.get, new Map(data.map(o => [o.data, o])) ); console.log(result);

您可以使用數組方法.filter.includes (因為searchFor是一個數組。)

 const searchFor = ['appInfo', 'questions']; const data = [ { id: '1', data: 'jobInfo' }, { id: '2', data: 'appInfo' }, { id: '3', data: 'documents' }, { id: '4', data: 'questions' }, ]; const result = data.filter(item => searchFor.includes(item.data)); console.log(result);

你可以這樣做:

 const searchFor = ['appInfo', 'questions']; const data = [ { id: '1', data: 'jobInfo' }, { id: '2', data: 'appInfo' }, { id: '3', data: 'documents' }, { id: '4', data: 'questions' }, ]; var res = data.filter(i=> searchFor.includes(i.data)) console.log(res)
如果你想將復雜度降低到 O(N),你可以考慮這個:

 const searchFor = ['appInfo', 'questions']; const data = [ { id: '1', data: 'jobInfo' }, { id: '2', data: 'appInfo' }, { id: '3', data: 'documents' }, { id: '4', data: 'questions' }, ]; var hashTable = {}; searchFor.forEach(i=> hashTable[i] = true ); var res = data.filter(i=>{ return hashTable[i.data] }); console.log(res)

您可以使用:

const results = data.filter(item => searchFor.includes(item.data)):
console.log(results):
 const result = data.filter((rec, id) => {
  if (searchFor.indexOf(rec.data) > -1) {
    return rec
  }
})
console.log(data.filter(element=>{
   return searchFor.includes(element.data)
}));

這里的想法是您必須獲取數據元素,然后必須在與搜索 object 匹配后過濾每個數據元素。因為搜索包含您的過濾條件的 object,因此它必須嵌套在外部迭代中,即我們的過濾方法已傳遞數據 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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