按字符串数组过滤对象数组

时间:2020-06-24 18:07:52

标签: javascript ecmascript-6

我的对象:

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等等,我不确定是否有更好的方法可以做到这一点。

预先感谢:)

7 个答案:

答案 0 :(得分:2)

您可以将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%;}

答案 1 :(得分:1)

对于键/对象对,您可以使用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);

答案 2 :(得分:1)

您可以使用Array方法.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);

答案 3 :(得分:1)

您可以这样做:

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)

答案 4 :(得分:0)

您可以使用:

const results = data.filter(item => searchFor.includes(item.data)):
console.log(results):

答案 5 :(得分:0)

 const result = data.filter((rec, id) => {
  if (searchFor.indexOf(rec.data) > -1) {
    return rec
  }
})

答案 6 :(得分:0)

console.log(data.filter(element=>{
   return searchFor.includes(element.data)
}));

这里的想法是,您必须先获取数据元素,然后在与对象搜索匹配之后必须对数据的每个元素进行过滤。因为搜索包含过滤条件的对象,因此必须嵌套在外部迭代中,即我们已将数据对象传递给了filter方法。