Javascript hasOwnProperty在对象数组中不工作,正在合并对象
我试图构建一个对象数组,但将相似的属性组合在一起并将它们的值相加。这么多的Javascript hasOwnProperty在对象数组中不工作,正在合并对象,javascript,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-1
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)
您的z
是一个数组,因此如果您像数组一样使用它,它将永远不会通过hasOwnProperty
测试,因为数组具有数字标记,而不是日期字符串标记。与其使用数组,不如尝试减少到对象中的查找(从中可以使用标准属性查找),然后在末尾获取该对象的值以将其返回到数组中。您可以使用Object.entries
一次获取键和值-由于对象只有一个键值对,因此无需在循环中使用for
const x=[
{"2018-09-13": "100"},
{"2018-09-14": "50"},
{"2018-09-14": "50"},
{"2018-09-15": "100"}
];
常量y=对象值(x.reduce)(a,obj)=>{
常量[[key,val]]=Object.entries(obj);
如果(!a[key])a[key]={[key]:val};
否则一个[key][key]+=','+val;
返回a;
}, {}));
控制台日志(y)
您的z
是一个数组,因此如果您像数组一样使用它,它将永远不会通过hasOwnProperty
测试,因为数组具有数字标记,而不是日期字符串标记。与其使用数组,不如尝试减少到对象中的查找(从中可以使用标准属性查找),然后在末尾获取该对象的值以将其返回到数组中。您可以使用Object.entries
一次获取键和值-由于对象只有一个键值对,因此无需在循环中使用for
const x=[
{"2018-09-13": "100"},
{"2018-09-14": "50"},
{"2018-09-14": "50"},
{"2018-09-15": "100"}
];
常量y=对象值(x.reduce)(a,obj)=>{
常量[[key,val]]=Object.entries(obj);
如果(!a[key])a[key]={[key]:val};
否则一个[key][key]+=','+val;
返回a;
}, {}));
控制台日志(y)代码>您可以通过减少数组来对数组进行分组,只有在找不到键的情况下才将值推送到累加器,如果找到了,只需更新值即可
var数组=[{
"2018-09-13": "100"
},
{
"2018-09-14": "50"
},
{
"2018-09-14": "50"
},
{
"2018-09-15": "100"
}
];
var分组=数组。减少((acc,obj)=>{
var old=null;
让key=Object.keys(obj)[0]
old=acc.find(item=>key==Object.keys(item)[0]);
如果(!旧){
加速推力(obj);
}否则{
旧的[key]+=`,${obj[key]}`;
}
返回acc;
}, []);
控制台日志(分组)代码>您可以通过减少数组来对数组进行分组,只有在找不到键的情况下才将值推送到累加器,如果找到了,只需更新值即可
var数组=[{
"2018-09-13": "100"
},
{
"2018-09-14": "50"
},
{
"2018-09-14": "50"
},
{
"2018-09-15": "100"
}
];
var分组=数组。减少((acc,obj)=>{
var old=null;
让key=Object.keys(obj)[0]
old=acc.find(item=>key==Object.keys(item)[0]);
如果(!旧){
加速推力(obj);
}否则{
旧的[key]+=`,${obj[key]}`;
}
返回acc;
}, []);
控制台日志(分组)
这不起作用的原因是z仅有的“自己的属性”是数字索引(起初没有,然后当您第一次将对象推到它上面时0
,然后当您下一次推时1
,依此类推)。我想不出一个简单的实现,但您需要通过z
(可能是使用forEach
,如果您发现一个项的键为date
,请将、
和新值附加到相应的字符串值。如果在z
结束时还没有找到一个,则在执行时推送一个新对象。这不起作用的原因是“own properties”z是数字索引(首先是无索引,然后是第一次将对象推到其上时的0
,然后是下一次推时的1
,依此类推)。我想不出一个简单的实现,但您需要通过z
(可能是使用forEach
,如果您找到一个键为date
的项目,请将、
和新值附加到相应的字符串值。如果在z
结束时还没有找到一个,则在执行操作时推送一个新对象。