如何在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],
});
});
});