为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2022-07-15 09:33:48
我有一个对象数组,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.
查看完整描述

4 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

您可以通过使用数据对象检查所有给定的键/值对来过滤数组。


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; }


查看完整回答
反对 回复 2022-07-15
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

-您istruecat仅根据arr. 您应该使用 reduce 来累积值:


let result = c.filter(e => arr.reduce((acc, element) => acc && e[element.type] === element.value, true))


查看完整回答
反对 回复 2022-07-15
?
HUX布斯

TA贡献1876条经验 获得超6个赞

这是c通过过滤器数组根据给定值减少列表的实现arr。请注意,输出是基于 中的初始内容的新列表c。


result = arr.reduce((acc, curr) => {

    acc = acc.filter(item => {

        return item[curr.type] === curr.value;

    });


    return acc;

}, c);


查看完整回答
反对 回复 2022-07-15
?
FFIVE

TA贡献1797条经验 获得超6个赞

或者一个递归和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);


查看完整回答
反对 回复 2022-07-15
  • 4 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信