Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 淘汰:从数组中生成可观察对象_Javascript_Arrays_Object_Knockout.js - Fatal编程技术网

Javascript 淘汰:从数组中生成可观察对象

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",

我有一个我认为很简单的问题要解决。。。但显然不是

我有一个服务器,它返回从数据库加载的对象列表(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"
        }
    ]
}
想法很简单:我想创建一个可观察的(我猜我实际上想要一个)但是我想要的不是数组,而是一个对象,其中属性是
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);

使用映射时,所有属性都变得可见