JS. 无法读取未定义的属性
2017-09-09
1070
初始代码:
var bestproducts = {}
data.forEach(function(element,index) {
bestproducts[element.shop_id][index] = element.product_data
}
在第一次迭代期间,我收到以下错误:
Uncaught TypeError: Cannot set property '0' of undefined
我遇到的唯一解决方案如下:
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
}
}
问题 :在这种情况下是否有更短/更优雅的解决方案?
3个回答
简短回答,不。您需要在分配之前定义一些对象。
更优雅的分配方式应该是这样的:
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]
分配给自身。
felixmosh
2017-09-09
您可以做类似的事情,直接用具有其自身属性的对象初始化
bestproducts[element.shop_id]
。
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>
当然,所有结果内容仅用于可视化,可以丢弃。
Marco de Zeeuw
2017-09-09
使用对象扩展运算符,这可以被视为更清洁的解决方案:
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
}
Lux
2017-09-09