如何在二维数组上应用ko.utils.arrayGetDistinctValues

时间:2014-01-30 19:44:13

标签: javascript arrays knockout.js

我有一个带有两个维度的ko.observableArray,即“id”和“name”。 ID将始终不同,但名称可以保持相同的值。

self.myArray = ko.observableArray( [ 
    { "id": "1", "name": "Barbara" }, 
    { "id": "2", "name": "Edwin"  }, 
    { "id": "3", "name": "Barbara" } 
] );

但是我想过滤数组,以便我的结果只保留第一次出现的“name”。

我想要的结果是:

self. myFilteredArray = [ 
    { "id": "1", "name": "Barbara" }, 
    { "id": "2", "name": "Edwin"  } 
];

我一直试图用ko.utils.arrayGetDistinctValues()来解决这个问题,但我怎样才能在一个选定的维度上使用它呢?

2 个答案:

答案 0 :(得分:2)

您可以使用计算器:

viewModel.myFilteredArray = ko.computed(function() {
  var rv = [], names = [];
  for(var i=0; i<this.myArray().length; i++) {
    if(names.indexOf(this.myArray()[i].name) === -1) {
      rv.push(this.myArray()[i]);
      names.push(this.myArray()[i].name);
    }
  }
  return rv;
}, viewModel);

答案 1 :(得分:1)

我可以建议一个循环遍历数组的函数,为每个项构建属性值的映射,并检查当前值是否已经添加。像这样:

function filterByFirstOccurance(arr, prop) {
    var propValuesHash = {},
    result = [];
    for (var i = 0, l = arr.length; i < l; i++) {
        var item = arr[i],
            propValue = item[prop];
        if (item.hasOwnProperty(prop) && !propValuesHash[propValue]) {
            propValuesHash[propValue] = true;
            result.push(item);
        }
    }
    return result;
};

Fiddle