在下划线中返回每个循环的值不会停止该函数

时间:2013-10-25 07:00:25

标签: javascript return underscore.js each

我注意到一个奇怪的行为,至少有一个我不明白的行为,同时在每个循环的下划线中返回值。我的代码如下,它基本上测试是否已经基于其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?

3 个答案:

答案 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也可能更适用于您的用例。

来源:

http://underscorejs.org/#each

http://underscorejs.org/#find

http://underscorejs.org/#some