使用 Lodash/Javascript 进行嵌套数组过滤

7

我有以下对象数组:

var sizeList = [
    { id: 1, title:"Test1",
        type:[{name:"Big", present:false}, {name:"Small", present:true}, {name:"Medium", present:false}]
    },

    { id: 2,title:"Test2",
        type:[{name:"Big", present:false}, {name:"Small", present:true}, {name:"Medium", present:false}]
    },
    { id: 3,title:"Test3",
        type:[{name:"Big", present:false}, {name:"Small", present:true}, {name:"Medium", present:true}]
    }
  ]

我想筛选Medium为True的列表。我目前已经设置了如下内容。
var specificSizes = _.filter(sizeList.type, { 'name': 'Medium', 'present': true })

这段代码一直返回一个空数组。我也尝试了这个方法:
       specificSizes = _.filter(sizeList.type, function (type) {
          return _.some(type, {'name': 'Medium', 'present':true})
        });

标题是关于“排序”?应该排序什么? - RomanPerekhrest
@RomanPerekhrest 啊,我的错,我是指过滤。我现在会更新的。 - lost9123193
1个回答

16
使用lodash,您可以将条件与原始对象相同的结构包装在测试中。
_.filter(sizeList, { type: [{ name: 'Medium', present: true }] })

var sizeList = [{ id: 1, title: "Test1", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: false }] }, { id: 2, title: "Test2", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: false }] }, { id: 3, title: "Test3", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: true }] }],      
    result = _.filter(sizeList, { type: [{ name: 'Medium', present: true }] });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

在纯Javascript中,你可以使用Array#filter处理外部数组,并且使用Array#some检查是否满足一个条件。

var sizeList = [{ id: 1, title: "Test1", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: false }] }, { id: 2, title: "Test2", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: false }] }, { id: 3, title: "Test3", type: [{ name: "Big", present: false }, { name: "Small", present: true }, { name: "Medium", present: true }] }],      
    result = sizeList.filter(function (a) {
        return a.type.some(function (b) {
            return b.name === 'Medium' && b.present;
        });
    });
  
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


1
这非常有用。非常感谢! - lost9123193
谢谢!非常有帮助 :) - Andrew Savetchuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接