如何根据数组内数组的值过滤数组?
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 true
是 some
(以前的 forEach
)的 return。
为什么这个测试没有通过?
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 true
是 some
(以前的 forEach
)的 return。