如何根据数组中数组的值过滤数组?

时间:2016-05-20 17:19:01

标签: javascript underscore.js lodash

为什么这个测试不通过?

it('lodash_test', function() {
    var arr = [{a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "33", y: "2"}]}]
    var result = _.filter(arr, function(obj) {
        obj.b.forEach(function(item_b) {
            if(item_b.x=="1") {
                return true;
            }
        });
    });
    expect(result).to.be.eql([{a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "1", y: "2"}]}]);
});

1 个答案:

答案 0 :(得分:1)

因为forEach的返回值被完全忽略,并且您的_.filter谓词函数永远不会返回任何内容。

您可能想要使用some

it('lodash_test', function() {
    var arr = [{a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "33", y: "2"}]}]
    var result = _.filter(arr, function(obj) {
        return obj.b.some(function(item_b) {
    //  ^^^^^^^      ^^^^
            if(item_b.x=="1") {
                return true;
            }
        });
    });
    expect(result).to.be.eql([{a: "x", b: [{x: "1", y: "2"}]}, {a: "x", b: [{x: "1", y: "2"}]}]);
});

Array#some为数组中的每个条目调用谓词,在谓词第一次返回truthy值时停止;如果谓词曾经返回真值,则返回值为true,否则返回false

所以我在上面强调的return是来自_.filter谓语的回报;您的原始return truesome(以前为forEach)的回复。