Javascript 淘汰:从数组中生成可观察对象
我有一个我认为很简单的问题要解决。。。但显然不是 我有一个服务器,它返回从数据库加载的对象列表(Json)。作为良好的数据库,所有这些对象都具有唯一的Javascript 淘汰:从数组中生成可观察对象,javascript,arrays,object,knockout.js,Javascript,Arrays,Object,Knockout.js,我有一个我认为很简单的问题要解决。。。但显然不是 我有一个服务器,它返回从数据库加载的对象列表(Json)。作为良好的数据库,所有这些对象都具有唯一的id属性: { "stores": [ { "id": "1f0", "name": "foo", "address": "foo is here street" }, { "id": "2b4",
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"
}
]
}
想法很简单:我想创建一个可观察的(我猜我实际上想要一个)但是我想要的不是数组,而是一个对象,其中属性是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
)是可观察的(所以我认为我不需要字段,对吧?)。我只是想知道如何创建这种结构
我试过:
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
成为一个由三个对象组成的对象,如下所示:
[
{
"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"
}
}
]
这不是我想要的
任何帮助都将不胜感激。提前谢谢。您不会真的想映射它,因为它总是返回一个新数组。一种选择是通过数组循环并构建如下对象:
var serversAsObject = {};
ko.utils.arrayForEach(serverStores, function(store) {
var id = store.id;
if (id) {
serversAsObject[id] = store;
}
});
self.stores = ko.observable(serversAsObject);
使用映射时,所有属性都变得可见