我有一个带有两个维度的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()来解决这个问题,但我怎样才能在一个选定的维度上使用它呢?
答案 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;
};