Lon*_*son 7 javascript arrays underscore.js knockout.js
我有一个可观察的对象数组,我想使用underscore.js来获取值
例如:
ko.observableArray([{
id: ko.observable(1),
name: ko.observable("name1")
},
{
id: ko.observable(2),
name: ko.observable("name2")
},
...])
Run Code Online (Sandbox Code Playgroud)
而我只想在对象内部而不是整个可观察对象中获取值.
我只用一个命令就可以做到这一点吗?
我试过了:
_.pluck(myArray(), "id()") 和 _.pluck(myArray(), "id"())
但是它们分别返回一个未定义的数组和"id不是函数".
谢谢!
使用_.invoke而不是_.pluck
请参阅此示例小提琴。
_.pluck(list, propertyName)按记录工作:
地图最常见用例的一个方便版本:提取属性值列表。
或者,正如 lodash 文档中更好的解释:_.pluck(collection, path)
从集合中的所有元素获取路径的属性值。
所以,如果你这样做:
_.pluck(myArray(), "id")
Run Code Online (Sandbox Code Playgroud)
你得到的是一个包含所有 的数组id。所有这些id都是可观察的,就像原始数组的对象一样
但您可以使用_.invoke(list, methodName, *arguments), ,如文档所示:
对列表中的每个值调用由 methodName 命名的方法。传递给 invoke 的任何额外参数都将转发到方法调用。
或者,在 lodash 版本上_.invoke(collection, path, [args])
对集合中的每个元素调用路径处的方法,返回每个调用方法的结果的数组。向每个调用的方法提供任何附加参数。如果 methodName 是一个函数,则调用它,并且 this 绑定到集合中的每个元素。
通过这种方式,您可以执行每个可观察量,并按预期获得其值:
_.invoke(myArray(), "id")
Run Code Online (Sandbox Code Playgroud)
对这个问题的第一条评论让我添加了这个通知:
最好的解决方案是将ko.toJS视图模型中的所有可观察量转换为具有常规属性的常规 JavaScript 对象。一旦你这样做了,下划线或任何其他库将按预期工作。
该_.invoke解决方案仅适用于单级可观察量,如本例所示。如果有多个级别的嵌套可观察量,它将完全失败,因为它在路径的末尾调用一个函数,而不是在路径的每个步骤,例如,_.invoke对于这种情况不起作用:
var advices = [{
person: ko.observable({
name = ko.observable('John')
}),
advice: ko.observable('Beware of the observables!')
}];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您只能_.invoke在第一级使用,如下所示:
var sentences = _.invoke(advices,'advice');
Run Code Online (Sandbox Code Playgroud)
但这是行不通的:
var names = _.invoke(advices,'person.name');
Run Code Online (Sandbox Code Playgroud)
在这个调用中, onlyname会被调用,但person不会,所以这会失败,因为person是一个可观察的,因此它没有属性name。
NOTE: lodash is another library similar, and mostly compatible with underscore, but better in some aspects