JS。无法读取未定义的属性

时间:2017-09-09 09:43:00

标签: javascript

初始代码:

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
  }
}

问题:在这种情况下是否有更短/更优雅的解决方案?

3 个答案:

答案 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;
&#13;
&#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
}