根据来自另一个对象数组的多个值过滤对象数组

我有一个对象数组,


c = [

  {

     name: 'abc',

     category: 'cat1',

     profitc: 'profit1',

     costc: 'cost1'

  },

  {

     name: 'xyz',

     category: '',

     profitc: 'profit1',

     costc: ''

  },

  {

     name: 'pqr',

     category: 'cat1',

     profitc: 'profit1',

     costc: ''

  }

]

现在我想根据另一个对象数组过滤数组,第二个对象数组是,


arr = [

 {

   type:'profitc'

   value: 'profit1',

 },

 {

   type:'category'

   value: 'cat1',

 }

]

现在 arr 显示在带有多个选择选项的下拉列表中,并且对象中的键值的值显示给用户,即利润 1、cat1 等。因此,如果用户选择profit1and cat1,那么我需要过滤数组c,这样,输出看起来像这样。


c = [

  {

     name: 'abc',

     category: 'cat1',

     profitc: 'profit1',

     costc: 'cost1'

  },

  {

     name: 'pqr',

     category: 'cat1',

     profitc: 'profit1',

     costc: ''

  }

]

我试着这样做。


let result = c.filter(e => {

  let istruecat = true


//arr is chosen value from user.

  arr.forEach(element => {

    istruecat = e[element.type] == element.value;

  })

  return istruecat;

})

但是当我这样做时,我会从c数组中获取所有对象。我在这里做错了什么?有没有办法使用 lodash.


qq_花开花谢_0
浏览 153回答 4
4回答

DIEA

您可以通过使用数据对象检查所有给定的键/值对来过滤数组。var data = [{ name: 'abc', category: 'cat1', profitc: 'profit1', costc: 'cost1' }, { name: 'xyz', category: '', profitc: 'profit1', costc: '' }, { name: 'pqr', category: 'cat1', profitc: 'profit1', costc: '' }],    filters = [{ type: 'profitc', value: 'profit1', }, { type: 'category', value: 'cat1' }],    result = data.filter(o => filters.every(({ type, value }) => o[type] === value));console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }

回首忆惘然

-您istruecat仅根据arr. 您应该使用 reduce 来累积值:let result = c.filter(e => arr.reduce((acc, element) => acc && e[element.type] === element.value, true))

HUX布斯

这是c通过过滤器数组根据给定值减少列表的实现arr。请注意,输出是基于 中的初始内容的新列表c。result = arr.reduce((acc, curr) => {    acc = acc.filter(item => {        return item[curr.type] === curr.value;    });    return acc;}, c);

FFIVE

或者一个递归和imo可读的解决方案:function myFilter(c, [first, ...rest]) {    if (first) {        const {type, value} = first;        // Recursively call myFilter with one filter removed        return myFilter(c, rest)           .filter(x => x[type] === value);    } else {        // Nothing left to filter        return c;    }}myFilter(c, arr);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript