Knockoutjs引用来自ID的对象

时间:2015-11-25 12:36:37

标签: javascript knockout.js

我有一些json数据如下所示:

var data = {
    Allergens: [{
            Id: 10,
            Label: 'Label 1',
            IconUrl: 'http://www.xyz.de/hello.png'
        }, {
            Id: 12,
            Label: 'Label 2',
            IconUrl: 'http://www.xyz.de/cu.png'
        }
    ],
    Day: {
        Items: [{
            AllergenIds: [10, 12],
            ExternalName: [{
                lang: 'de-DE',
                val: 'Ice Cream Vanilla (item 1)'
            }]
        }, {
            AllergenIds: [10],
            ExternalName: [{
                lang: 'de-DE',
                val: 'Ice Cream Strawberry (item 2)'
            }]
        }]
    }
};

让我说我在我的物品上做了一个淘汰赛。 每个项目都有一个AllergenIds列表。 对于这些AllergenIds,我想再渲染另一个包含相关Allergens项目的信息/内容。

有没有办法将这些过敏原反应到相应的过敏原项目?所以,我的愿望是当我编辑过敏原时,所有Items.Allergens都会更新!?

1 个答案:

答案 0 :(得分:2)

您需要能够Allergens查找Id,因此我首先要创建一个"索引"可以在以后使用

var allergenIndex = data.Allergens.reduce(function(prev,curr){
   prev[curr.Id] = curr;
   return prev;
},{});

然后当您遍历Day.Items阵列时,您可以找到每种过敏原的具体细节:

data.Day.Items.forEach(function(i){
   console.log(i.ExternalName[0].val) 
   i.AllergenIds.forEach(function(a){
       console.log("\tAllergen=" + allergenIndex[a].Label) 
   });
});

输出是:

Ice Cream Vanilla (item 1)
    Allergen=Label 1
    Allergen=Label 2
Ice Cream Strawberry (item 2)
    Allergen=Label 1

希望您可以根据需要使用它转换为淘汰赛。

实例:http://jsfiddle.net/7o3Lxcpc/

相关问题