我有一个可观察的对象数组,我想使用underscore.js来取出值
例如:
ko.observableArray([{
id: ko.observable(1),
name: ko.observable("name1")
},
{
id: ko.observable(2),
name: ko.observable("name2")
},
...])
而我只是想在对象内部而不是整个可观察对象中加载值。
我可以只使用一个命令执行此操作吗?
我试过了:
_.pluck(myArray(), "id()")
和_.pluck(myArray(), "id"())
但是这些返回了一个未定义的数组,并且" id不是一个函数"分别
谢谢!
答案 0 :(得分:4)
使用_.invoke
代替_.pluck
_.pluck(list, propertyName)
的工作原理如下:
可能是map最常见的用例的便捷版本:提取属性值列表。
或者,在lodash docs上更好地说明:_.pluck(collection, path)
从集合中的所有元素获取path的属性值。
所以,如果你这样做:
_.pluck(myArray(), "id")
你得到的是一个包含所有id
'的数组。所有这些id
都是可观察的,就像在原始数组的对象中一样
但您可以使用_.invoke(list, methodName, *arguments)
,正如记录所示:
对列表中的每个值调用methodName命名的方法。传递给调用的任何额外参数都将被转发到方法调用。
或者,在lodash版本_.invoke(collection, path, [args])
在集合中的每个元素的路径上调用方法,返回每个调用方法的结果数组。为每个调用的方法提供任何其他参数。如果methodName是一个函数,则为集合中的每个元素调用它,并将其绑定。
通过这种方式,您可以执行每个observable,并按预期获得其值:
_.invoke(myArray(), "id")
对这个问题的第一个评论让我加入了这个通知:
最佳解决方案是使用ko.toJS
将视图模型中的所有可观察对象转换为具有常规属性的常规JavaScript对象。一旦你这样做,下划线或任何其他库将按预期工作。
_.invoke
解决方案仅适用于单个级别的可观察对象,如本例所示。如果有多个级别的嵌套observable,它将完全失败,因为它在路径的末尾调用一个函数,而不是在路径的每一步,例如,_.invoke
不会为此工作情况下:
var advices = [{
person: ko.observable({
name = ko.observable('John')
}),
advice: ko.observable('Beware of the observables!')
}];
在这种情况下,您只能在第一级使用_.invoke
,如下所示:
var sentences = _.invoke(advices,'advice');
但这不会起作用:
var names = _.invoke(advices,'person.name');
在此调用中,只会调用name
,但person
不会调用,因此会失败,因为person
是可观察的,因此它没有{ {1}}属性。
注意:lodash是另一个类似的库,大多与下划线兼容,但在某些方面更好
答案 1 :(得分:2)
我能够通过使用" map"来解决这个问题。功能:
_.map(myArray(), function(item) {return item.id()});
但是我希望使用pluck,因为它是这类场景的确切用例。
答案 2 :(得分:2)
因为name
是一个函数,如何将pluck
原始数组转换为函数数组,然后使用ko.toJS
将其转换为字符串数组?
var myArray = ko.observableArray([{
id: ko.observable(1),
name: ko.observable("name1")
},
{
id: ko.observable(2),
name: ko.observable("name2")
}]);
var names = _.pluck(myArray(), 'name');
console.log(ko.toJS(names)); // Output: ["name1", "name2"]
答案 3 :(得分:1)
先打开它
main.cpp:(.text+0x179): undefined reference to `GD::extractData(TPt<TNGraph>*, int, DataPoint*)'
main.cpp:(.text+0x1b9): undefined reference to `GD::extractData(TPt<TNGraph>*, int, DataPoint*)'
main.cpp:(.text+0x1dd): undefined reference to `GD::discoverMotifs(DataPoint**)'
collect2: error: ld returned 1 exit status