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

How to filter arrays depending on the values of arrays inside the array?

为什么这个测试没有通过?

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"}]}]);
});

因为 forEach 的 return 值被完全忽略,并且您的 _.filter 谓词函数从来没有 return 任何东西。

您可能想使用 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 为数组中的每个条目调用谓词,在第一次谓词 return 为真值时停止;它的 return 值是 true 如果谓词曾经 return 一个真值,或者 false 如果不是。

所以我在上面强调的 return_.filter 谓词中的 return;您原来的 return truesome(以前的 forEach)的 return。