Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript hasOwnProperty在对象数组中不工作,正在合并对象_Javascript - Fatal编程技术网

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
结束时还没有找到一个,则在执行操作时推送一个新对象。