在循环中分配json值时,值被覆盖

value got overwritten assigning json value within loop

本文关键字:覆盖 值时 json 循环 分配      更新时间:2023-09-26

如何生成这样的东西?

{
    "drink": {
        "2": {
            "name": "coke",
            "type": "drink"
        },
        "3": {
            "name": "coke",
            "type": "drink"
        }
    },
    "food": {
        "id": "1",
        "name": "1 Hour Snooker",
        "type": "food"
    }
}

我在"饮料"对象下生成多个对象时遇到问题。它被我下面的代码覆盖了:

http://jsfiddle.net/jLgh4at5/

var json = {
    "results": {
        "slots": [{
            "id": "3",
                "name": "pepsi",
                "type": "drink"
        }, {
            "id": "1",
                "name": "1 Hour Snooker",
                "type": "food"
        }, {
            "id": "2",
                "name": "coke",
                "type": "drink"
        }]
    }
}
var data = {
    "slots": {
    }
}
json.results.slots.forEach(function (b) {
    if (b["type"] == "food") {
        data.slots["food"] = b;
    } else {
        data.slots["drink"] = b;
    }
});
console.log(data);

使用数组索引来解决问题。

json.results.slots.forEach(function (b,i) {
    if (b["type"] == "food") {
        if(data.slots["food"]) 
            data.slots["food"][i] = {"name":b.name,"type":"food"}; 
        else 
            data.slots["food"] = {};
    } else {
        if(data.slots["drink"]) 
            data.slots["drink"][i] = {"name":b.name,"type":"drink"};
        else 
            data.slots["drink"] = {};
    }
});

或者,您可以优化代码,如下所示。

var data = {
    "slots": {
       "food": {},
       "drink": {}
    }
};
json.results.slots.forEach(function (b,i) {
     if (b["type"] == "food") {
        data.slots["food"][i] = {"name":b.name,"type":"food"};
    } else {
        data.slots["drink"][i] = {"name":b.name,"type":"drink"};;
    }
});

这是更新的JSFiddle