Underscore.js _.where方法

时间:2016-02-08 18:29:36

标签: javascript underscore.js

来自Underscore.js

的文档

_.where(list, properties);

查看列表中的每个值,返回包含属性中列出的所有键值对的所有值的数组。

基本上你给它一个对象作为list,并将'键值对'作为properties传递。这些“键值对/属性”是您用来告诉where取出和返回的标记。

话虽如此,我尝试了以下内容:

var obj = {
    innerObj1 : { 
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger", 
                  space: 7
                }, 
    innerObj2 : {
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger2", 
                  space: 1
                }, 
    innerOnj3 : {
                  speak: function(){console.log('My name is ' + name);}, 
                  name: "Tiger3", 
                  space: 3}, 
    innerObj4 : {
                 speak: function(){console.log('My name is ' + name);}, 
                 name: "Tiger4", 
                 space: 3}
};

返回:

_.where(obj,{speak:function(){console.log('My name is ' + name);}});
[] //returns a empty array, WHAT?!

VS

function speak(){console.log('My name is ' + name);}



var obj = {
    innerObj1 : { 
                  speak: speak, 
                  name: "Tiger", 
                  space: 7
                }, 
    innerObj2 : {
                  speak: speak, 
                  name: "Tiger2", 
                  space: 1
                }, 
    innerOnj3 : {
                  speak: speak, 
                  name: "Tiger3", 
                  space: 3}, 
    innerObj4 : {
                  speak: speak, 
                 name: "Tiger4", 
                 space: 3}
};


_.where(obj,{speak:speak});

这将返回:

[Objectname: "Tiger"space: 7speak: speak()__proto__: Object, Objectname: "Tiger2"space: 1speak: speak()__proto__: Object, Objectname: "Tiger3"space: 3speak: speak()__proto__: Object, Objectname: "Tiger4"space: 3speak: speak()__proto__: Object]

这就是我的困惑所在。为什么第一个方法只返回一个空对象,但第二个方法返回你期望的...

我知道这个question,但它对我的困惑没有帮助...... 提前谢谢!

1 个答案:

答案 0 :(得分:2)

这实际上是一个非常好的预期结果。

您可以在第一个示例中看到为每个对象创建一个新函数,以便:

innerObj1.speak !== innerObj2.speak。该函数可能看起来是相同的,但它是一个不同的对象。不仅所有speak值彼此不同,它们也与您在_.where()函数中作为值传递的(也是新的!)函数不同。

在第二个示例中,您定义了一个函数并引用来自每个对象的所有innerObj1.speak === innerObj2.speak,因为所有speak属性都引用相同的函数。

看看:Fiddle