在Knockout中合并数组

时间:2015-03-17 11:48:12

标签: arrays knockout.js

在我的淘汰应用程序中,我有两个可观察的数组。一个是位置,

self.locations = ko.observableArray([]).withIndex('id');

这包含所有位置。这些位置可以与项目相关联。如果项目中不存在位置,则项目标识为null。

另一个数组是项目。它包含所有项目,如果它们有任何位置,它有一系列位置。

现在我要做的是获得一个包含两个像

这样的组合的数组
displayLocations = {
  location1 = {name = "abc", ...}
  ... these don't have any projects
  location9 = {name = "xyz", projectName = "project1", .. }
}

我正在尝试为其创建一个计算属性,然后在视图方面,我正在考虑使用不同的模板,具体取决于该位置是否具有项目。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

不确定withIndex方法,但使用vanilla KO,您可以在ko.utils.arrayMap内使用computed

this.associatedLocations = ko.computed(function() {
  var dataLoc = this.locations(),
      dataProj = this.projects(), 
      result = ko.utils.arrayMap(dataLoc, function(loc) {
         var newObj = loc, project;
         if (loc.projectId !== null) {
            project = ko.utils.arrayFirst(dataProj, function(proj) {
               return proj.id === loc.projectId;
            });
            newObj.projectData = proj;
         }
         return newObj;
      });
  return result;
}, this);
// assumes locations have a 'projectId' & 'name' property, & projects an 'id' property
// will return an array in the form of
// [ {name: 'xyz', projectData: { id: ..., projectName: ...}}]

您可以通过执行以下操作来测试某个位置是否与项目相关联:

<div data-bind="template: {
   name: obj.projectData ?  'nameIfProject' : 'nameIfNoProject' }">
</div>