我注意到一个奇怪的行为,至少有一个我不明白的行为,同时在每个循环的下划线中返回值。我的代码如下,它基本上测试是否已经基于其id在数组中存在元素,如下所示:
var elements = [{id: "1", name : "foo"},{id : "3", name: "bar"}];
element_exists = function(key, val){
_.each(elements,function(element){
console.log(element[key], val);
if(element[key] == val){
console.log("element exists");
return true;
}
});
return false;
};
console.log("true : ", element_exists("id", "1"));
console.log("false : ", element_exists("id", "2"));
我在控制台中收到以下日志:
1 1
element exists
3 1
true : false
1 2
3 2
false : false
我的问题是为什么第一个元素的函数没有返回true?
答案 0 :(得分:6)
@ltbesh你弄错了! 函数 返回值&停。 它只继续为输入中的其余元素执行迭代器函数。
您使用_.each
方法混淆了循环语句。
_.each
方法的第二个参数是迭代器函数。它基本上是为数组的每个元素执行的函数。因此,如果在迭代器函数中编写return
语句,它只会终止该特定函数调用。继续为数组中的其余元素调用该函数。
答案 1 :(得分:1)
这种情况正在发生,因为你总是从函数返回false。
如果您想继续使用each()
功能,请重写此内容。
var elements = [{id: "1", name : "foo"},{id : "3", name: "bar"}];
element_exists = function(key, val){
var someFlag = false;
_.each(elements, function(element){
console.log(element[key] +" - "+ val);
if(element[key] == val){
console.log("element exists");
someFlag = true;
}
});
return someFlag;
};
console.log("should be true : " + element_exists("id", "1"));
console.log("should be false : " +element_exists("id", "2"));
答案 2 :(得分:0)
有点晚了,但接受的答案没有提供解决方案,所以:
Underscore建议使用函数_.find
,它迭代一个值列表并返回第一个通过真值测试的函数,否则返回undefined
。
这样你就可以摆脱循环。
但是,由于返回值是实际元素而不是布尔值,因此在调用函数时,如果函数返回定义的值,则可以添加包装器以返回true
。
_.some
也可能更适用于您的用例。
来源: