如何在Javascript中压缩和重新映射数组数据

如何在Javascript中压缩和重新映射数组数据,javascript,arrays,sorting,reduce,remap,Javascript,Arrays,Sorting,Reduce,Remap,我有这个数据数组,需要它的重新映射版本来遍历日期 var objArr = [ {"Country": "US", "2017-07-12": "1", "2017-07-13": "2"}, {"Country": "US", "2017-07-12": "2", "2017-07-13": "2"}, {"Country": "CN", "2017-07-12": "5", "2017-07-13": "7"}, {"Country": "CN",

我有这个数据数组,需要它的重新映射版本来遍历日期

var objArr = [
     {"Country": "US", "2017-07-12": "1", "2017-07-13": "2"},
     {"Country": "US", "2017-07-12": "2", "2017-07-13": "2"},
     {"Country": "CN",  "2017-07-12": "5", "2017-07-13": "7"},
     {"Country": "CN", "2017-07-12": "5", "2017-07-13": "7"}
   ]
  • 各国应将其价值相加,且不应在内部数组中出现两次
  • 最后我想要一个这样的数组:
在我目前的情况下,我得到了这一点,但国家应该减少,并将价值相加:

var remapped = [
   {"2017-07-12": [
                {"Country: "US", "value": 1}, 
                {"Country: "US", "value": 2}, 
                {"Country: "CN", "value": 5}],
                {"Country: "CN", "value": 5}
                  ],
   {"2017-07-13": [
                {"Country: "US", "value": 2},
                {"Country: "US", "value": 2},
                {"Country: "US", "value": 7}
                {"Country: "US", "value": 7}
                 ]
 ]
这就是我到目前为止所做的。但对我来说,这似乎过于复杂,我相信有一种更有效的方法来解决这个问题: 在这个州,我将国家重新映射到日期中,但不确定如何“减少”它们。我真的需要对数组进行多次迭代吗

const res = [];
dateArray.forEach(date => (objArr[date] = [])); // I create an array with dates which could contain another array

objArr.forEach(item => {
  dates.forEach(date => {
    res[date].push({
      Country: item['Country'],
      value: item[date],
    });
  });
});

您可以使用
reduce
方法执行此操作,首先将每个日期的值存储在一个对象中,这样您就可以按国家对它们进行分组,然后将这些对象转换为数组

var数据=[
{“国家”:“美国”,“2017-07-12”:“1”,“2017-07-13”:“2”},
{“国家”:“美国”,“2017-07-12”:“2”,“2017-07-13”:“2”},
{“国家”:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”},
{“国家”:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”}
]
const result=data.reduce((r,{Country,…rest},i)=>{
Object.entries(rest.forEach)([k,v])=>{
如果(!r[k])r[k]={}
如果(!r[k][Country])r[k][Country]={Country,值:+v}
其他r[k][Country]。值+=+v
})
返回r;
}, {})
for(让我输入结果){
结果[i]=对象值(结果[i])
}

log(result)
您可以使用helper对象作为对象的引用,并迭代给定数据的键/值对

var数据=[{国家:“美国”,“2017-07-12”:“1”,“2017-07-13”:“2”},{国家:“美国”,“2017-07-12”:“2”,“2017-07-13”:“2”},{国家:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”},{国家:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”},
引用={},
结果=数据.reduce((r,{Country,…o})=>{
Object.entries(o.forEach)([k,v])=>{
如果(!引用[k]){
参考文献[k]={{uU:[]};
r、 push({[k]:引用[k].});
}
如果(!参考[k][国家]){
引用[k]。uu.push(引用[k][Country]={Country,值:0});
}
参考[k][国家]。值+=+v;
});
返回r;
}, []);
控制台日志(结果)

.as控制台包装{max height:100%!important;top:0;}
以下是另一种方法:

const extractDates=objArr=>Object.entries(objArr.reduce(
(a,{Country,…rest})=>Object.entries(rest).reduce((a,[date,val])=>({
A.
[日期]:{…a[日期],[国家]:((a[日期]| |{})[国家]| | 0)+号码(val)}
}),a),
{}
)).map([d,o])=>({[d]:Object.entries(o).map([k,v])=>({Country:k,value:v})))
const objArr=[{“国家”:“美国”,“2017-07-12”:“1”,“2017-07-13”:“2”},{“国家”:“美国”,“2017-07-12”:“2”,“2017-07-13”:“2”},{“国家”:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”},{“国家”:“CN”,“2017-07-12”:“5”,“2017-07-13”:“7”}]
console.log(提取日期(objArr))

。作为控制台包装{max height:100%!important;top:0}
此输出似乎比请求的格式更符合逻辑,但请注意,它是不同的。它要求一个包含一个值对象的数组。
const res = [];
dateArray.forEach(date => (objArr[date] = [])); // I create an array with dates which could contain another array

objArr.forEach(item => {
  dates.forEach(date => {
    res[date].push({
      Country: item['Country'],
      value: item[date],
    });
  });
});