初始代码:
var bestproducts = {}
data.forEach(function(element,index) {
bestproducts[element.shop_id][index] = element.product_data
}
在第一次迭代中,我收到以下错误:
未捕获的TypeError:无法设置属性' 0'未定义的
我遇到的唯一解决方案如下:
var bestproducts = []
data.forEach(function(element,index) {
if(!bestproducts[element.shop_id]){
bestproducts[element.shop_id] = {}
bestproducts[element.shop_id][index] = element.product_data
} else {
bestproducts[element.shop_id][index] = element.product_data
}
}
问题:在这种情况下是否有更短/更优雅的解决方案?
答案 0 :(得分:0)
简短的回答,没有。在分配对象之前,您需要定义一些对象。
更优雅的分配方式如下:
var bestproducts = []
data.forEach(function(element,index) {
bestproducts[element.shop_id] = bestproducts[element.shop_id] || {};
bestproducts[element.shop_id][index] = element.product_data;
}
bestproducts[element.shop_id] || {}
第一次bestproducts[element.shop_id]
未定义,因此您将分配空对象的第一个值。
对于迭代的其余部分bestproducts[element.shop_id]
未定义,因此它会将bestproducts[element.shop_id]
分配给自己。
答案 1 :(得分:0)
你可以做这样的事情,直接用一个有自己属性的对象初始化var data = [{shop_id: "a1", product_data: "a1_prod"}, {shop_id: "a2", product_data: "a2_prod"}];
var result = "";
var bestproducts = {};
data.forEach(function(element,index) {
bestproducts[element.shop_id] = { [index]: element.product_data };
result += bestproducts[element.shop_id][index] + " ";
});
document.getElementById("result").innerHTML = result;
。
<div id="result"></div>
&#13;
{{1}}&#13;
当然,所有结果都只是用于可视化,可以丢弃。
答案 2 :(得分:0)
使用对象扩展运算符,可以将其视为更清晰的解决方案:
var bestproducts = []
data.forEach(function(element,index) {
bestproducts[element.shop_id] = {
...bestproducts[element.shop_id],
[index]: element.product_data,
}
}
但是我认为原始代码的清洁版是最好的方法:
var bestproducts = []
data.forEach(function(element,index) {
if(!bestproducts[element.shop_id]){
bestproducts[element.shop_id] = {}
}
bestproducts[element.shop_id][index] = element.product_data
}