Knockout:从数组中创建可观察对象

时间:2014-05-16 23:12:01

标签: javascript arrays object knockout.js

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

我有一个服务器,它返回从数据库加载的对象列表(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"
         }
}

我不需要任何字段(idnameaddress)是可观察的(所以我认为我不需要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"
       }
    }
]

这不是我想要的。

任何帮助将不胜感激。提前谢谢。

1 个答案:

答案 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);