为什么这个测试不通过?
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"}]}]);
});
答案 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 true
是some
(以前为forEach
)的回复。