hasOwnProperty无法在对象数组中工作,无法合并对象

时间:2018-09-13 23:17:40

标签: javascript

我正在尝试构建一个对象数组,但要组合相似的属性并将它们的值加在一起。如此多的x数组应该变成对象的y数组。它必须是对象数组,而不仅仅是数组

 var x = [
    {"2018-09-13": "100"},
    {"2018-09-14": "50"},
    {"2018-09-14": "50"},
    {"2018-09-15": "100"}
 ];

所需结果

 var y = [
    {"2018-09-13": "100"},
    {"2018-09-14": "50,50"},
    {"2018-09-15": "100"}
 ];

这是我正在运行的将它们添加在一起的功能,但是不起作用。我相信这与导致hasOwnProperty方法出现问题的数组索引有关

var z = [];

x.forEach((item) => {
    for(var date in item) {
        if(z.hasOwnProperty(date)) {
            z[date] +=  "," + item[date];
           } else {
            z.push({[date]: item[date]});
           }
         }
    })


console.log(z)

2 个答案:

答案 0 :(得分:1)

您的z是一个数组,因此,如果您像数组一样使用它,它将永远不会通过hasOwnProperty测试,因为数组具有数字索引,而不是日期字符串索引。代替使用数组,尝试reduce进入对象(您可以从中使用标准属性查找),然后最后获取该对象的值以将其转换回数组。您可以使用Object.entries一次获取键和值-由于对象只有一对键值对,因此无需使用for..in循环。

const x = [
  {"2018-09-13": "100"},
  {"2018-09-14": "50"},
  {"2018-09-14": "50"},
  {"2018-09-15": "100"}
];
const y = Object.values(x.reduce((a, obj) => {
  const [[key, val]] = Object.entries(obj);
  if (!a[key]) a[key] = { [key] : val };
  else a[key][key] += ',' + val;
  return a;
}, {}));
console.log(y);

答案 1 :(得分:1)

您可以通过减少数组来对数组进行分组,然后仅在未找到键的情况下才将值推入累加器,如果找到键,只需更新值即可...

var array = [{
    "2018-09-13": "100"
  },
  {
    "2018-09-14": "50"
  },
  {
    "2018-09-14": "50"
  },
  {
    "2018-09-15": "100"
  }
];

var grouped = array.reduce((acc, obj) => {
  var old = null;
  let key = Object.keys(obj)[0]
  old = acc.find(item => key == Object.keys(item)[0]);
  if (!old) {
    acc.push(obj);
  } else {
    old[key] += `, ${obj[key]}`;
  }
  
  return acc;
}, []);

console.log(grouped);