使用underscore.js"采摘"在一个淘汰赛可观察阵列上

时间:2015-05-05 16:43:04

标签: javascript arrays knockout.js underscore.js

我有一个可观察的对象数组,我想使用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不是一个函数"分别

谢谢!

4 个答案:

答案 0 :(得分:4)

简短回答

使用_.invoke代替_.pluck

请参阅this sample fiddle

答案很长

_.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