开发者问题收集

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