У меня есть наблюдаемый массив в моей модели ночного видя js, который привязывается к таблице html на мой взгляд (вид бритвы на MVC).
Эта таблица заполняет элементы из другой таблицы, в которой есть кнопка "добавить", поэтому пользователь может добавить столько же одного элемента в таблицу назначения. Моя проблема в том, что я хочу показать в моей другой таблице только по одному для каждого элемента... поэтому, если пользователь добавляет Item1 30 раз, таблица должна показывать Item1 - 30, а не 30 раз Item1.. но, конечно, наблюдаемый массив должны иметь эти 30 предметов Item1.
Как я могу это сделать?
Попробуйте этот фрагмент кода, где self.items - это ваш исходный массив со всеми элементами.
self.unique = ko.computed(function() {
var values = ko.utils.arrayMap(self.items(), function(item){ return item.type})
return ko.utils.arrayGetDistinctValues(values).sort();
});
Попробуйте группировать массив по счету следующим образом:
function GroupArrayByCount(arr) {
var a = [],
b = [],
prev, result = [];
arr.sort();
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== prev) {
a.push(arr[i]);
b.push(1);
} else {
b[b.length - 1]++;
}
prev = arr[i];
}
for (var j = 0; j < a.length; j++) {
result.push({
name: a[j],
count: b[j]
});
}
return result;
}
Теперь вызовите его в viewModel, как это.
self.groupedItems = ko.computed(function(){
return GroupArrayByCount( self.items());
});
Сценарий: http://jsfiddle.net/codovations/edJwu/