Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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 将不同的属性展平到单个数组中_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 将不同的属性展平到单个数组中

Javascript 将不同的属性展平到单个数组中,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个javascript对象文本,如下所示 data: { prop1ByZones:[{zone: "Zone1", x: 1}, {zone: "Zone2", x: 5}], prop2ByZones:[{zone: "Zone1", y: "1302.5"}], prop3ByZones:[{zone: "Zone2", z: 2}] } 输出应类似于- output: [{zone: "Zone1", x: 1, y: "

我有一个javascript对象文本,如下所示

    data: {
       prop1ByZones:[{zone: "Zone1", x: 1}, {zone: "Zone2", x: 5}],
       prop2ByZones:[{zone: "Zone1", y: "1302.5"}],
       prop3ByZones:[{zone: "Zone2", z: 2}]
    }
输出应类似于-

output: [{zone: "Zone1", x: 1, y: "1302.5", z: 0}, {zone: "Zone2", x: 5, y: 0, z: 2}]
我可以用一种简单的方式来做,比如首先将Prob1Byzone添加到输出,然后循环Prob2Byzones和prop3ByZones,检查现有的zone。如果区域存在,则更新它,否则添加它

我只是想看看有没有什么优雅的方法。请让我知道。

一种可能的方法:

var data={prop1ByZones:[{zone:'Zone1',x:1},{zone:'Zone2',x:5}],prop2ByZones:[{zone:'Zone1',y:'1302.5}],prop3ByZones:[{zone:'Zone2',z:2}]
var arr=[…data.prop1ByZones,…data.prop2ByZones,…data.prop3ByZones]
var resp=arr.reduce((acc,{zone,x,y,z})=>{
var prev=acc.find(x=>zone==x.zone);
如果(上一个){
上一个x=x?x:上一个x,
上一个y=y?y:上一个y,
上一个z=z?z:上一个z
返回acc;
}
返回acc.concat({zone:zone,x:x?x:0,y:y?y:0,z:z?z:0});
}, []);
console.log(resp)
.as console wrapper{max height:100%!important;top:0;}
有一种方法可以做到这一点(使用lodash进行迭代),您可以将条件稍微优化为三元组等,但这将为您提供输出:

const data = {
       prop1ByZones:[{zone: "Zone1", x: 1}, {zone: "Zone2", x: 5}],
       prop2ByZones:[{zone: "Zone1", y: "1302.5"}],
       prop3ByZones:[{zone: "Zone2", z: 2}]

};

let list = {};
_.each(data, (d, i) => {
   _.each(d, (e) => {
     const zone = e.zone;

     if (!list[zone]) {
       list[zone] = zone;
       list[zone] = {};
     }

     if (!list[zone].x) {
        list[zone].x = e.x || 0;  
     }

     if (!list[zone].y) {
        list[zone].y = e.y || 0;  
     }

     if (!list[zone].z) {
        list[zone].z = e.z || 0;  
     }

   });

});
// put everything in an array
let result = [];
_.each(list, (obj, k) => {
  result.push({
    zone: k,
    x: obj.x,
    y: obj.y,
    z: obj.z
  });
});

console.log(result);
您可以获取,通过“进入”展平为单个数组,然后将数组展平为,然后将迭代器展回数组:

const数据={
Pro1Byzone:[{区域:“区域1”,x:1},{区域:“区域2”,x:5}],
Prob2Byzone:[{地带:“地带1”,y:“1302.5”},
prop3ByZones:[{zone:“Zone2”,z:2}]
}
const result=[…//将映射值迭代器(请参见结束)传回数组
[].concat(…Object.values(data))//获取对象的值并展平到单个数组
.reduce(//将数组缩减为映射
//将区域键添加到地图,并包括上一个和当前项
(r,o)=>r.set(o.zone,{…(r.get(o.zone)|{}),…o}),
新地图()
).values()]//获取映射值迭代器

控制台。日志(结果)< /C> >您可以考虑在数据的值上循环并连接各种数组。你的尝试在哪里?类似于
Object.values(data).reduce((acc,arr)=>acc.concat(arr),[])