我有我认为这是一个非常简单的问题要解决......但显然不是。
我有一个服务器,它返回从数据库加载的对象列表(Json)。作为良好的数据库,所有这些对象都具有唯一的id
属性:
{
"stores": [
{
"id": "1f0",
"name": "foo",
"address": "foo is here street"
},
{
"id": "2b4",
"name": "bar",
"address": "bar is here street"
},
{
"id": "3b4",
"name": "baz",
"address": "baz is here street"
}
]
}
这个想法很简单:我想创建一个observable(我猜我其实想要一个observableArray)但是我想要一个对象,其中属性是id
属性值是整个store
对象:
{
"1f0": {
"id": "1f0",
"name": "foo",
"address": "foo is here street"
},
"2b4": {
"id": "2b4",
"name": "bar",
"address": "bar is here street"
},
"3b4": {
"id": "3b4",
"name": "baz",
"address": "baz is here street"
}
}
我不需要任何字段(id
,name
或address
)是可观察的(所以我认为我不需要mapping,对?)。我只想知道如何创建该结构。
我试过了:
var self = this;
self.stores = ko.observableArray();
[ . . . ]
self.stores = ko.utils.arrayMap(
serverStores,
function(store){
var retval = {};
retval[store['_id']] = store;
return retval;
});
但这使self.stores
成为三个Object
中的一个:
[
{
"1f0": {
"id": "1f0",
"name": "foo",
"address": "foo is here street"
},
},
{
"2b4": {
"id": "2b4",
"name": "bar",
"address": "bar is here street"
},
},
{
"3b4": {
"id": "3b4",
"name": "baz",
"address": "baz is here street"
}
}
]
这不是我想要的。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
你真的不想map
它,因为它总是返回一个新数组。一种选择是循环遍历数组并构建一个对象,如:
var serversAsObject = {};
ko.utils.arrayForEach(serverStores, function(store) {
var id = store.id;
if (id) {
serversAsObject[id] = store;
}
});
self.stores = ko.observable(serversAsObject);