我有一个包含3个项目的'flat'数组:
[{"title":"welcome","file":"default.aspx","category":"finance"},
{"title":"test2","file":"test2.aspx","category":"finance"},
{"title":"test1","file":"test1.aspx","category":"housing"}]
目标是将其转换为带有2个项目的嵌套observableArray:
[{"category":"finance","content":[
{"title":"welcome","file":"default.aspx","category":"finance"},
{"title":"test2","file":"test2.aspx","category":"finance"}]},
{"category":"housing","content":[
{"title":"test1","file":"test1.aspx","category":"housing"}]}]
http://www.knockmeout.net/2011/04/utility-functions-in-knockoutjs.html帮助我分两步提取独特的类别:
self.getcategories = ko.computed(function () {
var categories = ko.utils.arrayMap(self.pages(), function (item) {
return item.category();
});
return categories.sort();
});
self.uniqueCategories = ko.dependentObservable(function() {
return ko.utils.arrayGetDistinctValues(self.self.getcategories()).sort();
});
//uniqueCategories: ["finance","housing"]
但是我无法弄清楚如何创建嵌套数组。我得到了这个:
self.createCategories = ko.computed(function () {
ko.utils.arrayForEach(self.uniqueCategories(), function (item) {
var content = getCategoryContent(item);
var c = new category(item, content);
self.Categories.push(c);
});
return true;
});
function getCategoryContent(whichcategory) {
return ko.utils.arrayFilter(self.pages(), function (page) {
return page.category() === whichcategory;
});
}
然而,它产生了5个类别项目(财务4x,住房1x),我预计只有2个。
答案 0 :(得分:0)
您的计算函数createCategories可能被多次调用。例如如果要一次向一个()数组中添加一个项目,这将在每次添加项目时触发createCategories函数。
通常你会创建categories数组并从计算函数返回它。目前,您正在添加到Categories observable数组,而不是每次都清除它。
一个简单的解决方法是清除createCategories函数顶部的Categories数组。这将使您处于奇怪的情况,必须至少调用createCategories一次来设置依赖项,但之后它将在数据更改时自动工作。
另一种选择是创建一个数组并从createCategories函数返回它,然后你可以将函数重命名为Categories而不是一个可观察的数组。这将是我通常使用计算函数的方式。
更多选项是将工作作为普通的JavaScript函数(而非计算),并在更改原始数组时手动调用createCategories(例如,当您从服务器返回结果时)。