Underscore.js _.where 方法的意外结果
Unexpected results from the Underscore.js _.where method
的文档
_.where(list, properties);
查看列表中的每个值,return创建包含属性中列出的所有键值对的所有值的数组。
基本上你给它一个对象作为 list
,并传递 'key-value pairs' 作为 properties
。那些 'key-value pairs/properties' 是您用来告诉 where
拉出什么和 return.
的标记
话虽如此,我尝试了以下方法:
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}
};
这个returns:
_.where(obj,{speak:function(){console.log('My name is ' + name);}});
[] //returns a empty array, WHAT?!
对比
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});
这将 return:
[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]
这就是我的困惑所在。为什么第一个方法只是 return 一个空对象,而第二个方法 return 是你所期望的...
我知道这个 question 但这对我的困惑没有帮助...
提前致谢!
这实际上是一个很好的预期结果。
你看,在你的第一个例子中,你为每个对象创建了一个新函数,这样:
innerObj1.speak !== innerObj2.speak
。功能可能看起来相同,但它是不同的对象。不仅所有 speak
值彼此不同,它们也不同于您在 _.where()
函数中作为值传递的(也是新的!)函数。
在第二个示例中,您定义了一个函数并从每个对象引用该函数,所以现在 innerObj1.speak === innerObj2.speak
,因为所有 speak
属性都引用相同的函数。
看看:Fiddle
_.where(list, properties);
查看列表中的每个值,return创建包含属性中列出的所有键值对的所有值的数组。
基本上你给它一个对象作为 list
,并传递 'key-value pairs' 作为 properties
。那些 'key-value pairs/properties' 是您用来告诉 where
拉出什么和 return.
话虽如此,我尝试了以下方法:
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}
};
这个returns:
_.where(obj,{speak:function(){console.log('My name is ' + name);}});
[] //returns a empty array, WHAT?!
对比
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});
这将 return:
[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]
这就是我的困惑所在。为什么第一个方法只是 return 一个空对象,而第二个方法 return 是你所期望的...
我知道这个 question 但这对我的困惑没有帮助... 提前致谢!
这实际上是一个很好的预期结果。
你看,在你的第一个例子中,你为每个对象创建了一个新函数,这样:
innerObj1.speak !== innerObj2.speak
。功能可能看起来相同,但它是不同的对象。不仅所有 speak
值彼此不同,它们也不同于您在 _.where()
函数中作为值传递的(也是新的!)函数。
在第二个示例中,您定义了一个函数并从每个对象引用该函数,所以现在 innerObj1.speak === innerObj2.speak
,因为所有 speak
属性都引用相同的函数。
看看:Fiddle