我希望用相同的键动态合并多个对象的单个数组。数据的一个例子是:
var data = [{
ReportTime: "30 Apr 2017BDT",
Rate: "1.00000",
AvgGrowth: "0.0"
}, {
ReportTime: "30 Apr 2017BDT",
Rate: "0.01107",
AvgGrowth: "0.1"
}, {
ReportTime: "29 Apr 2017BDT",
Rate: "1.00000",
AvgGrowth: "0.0"
}, {
ReportTime: "29 Apr 2017BDT",
Rate: "0.01107",
AvgGrowth: "-0.5"
}]我想生成这样的数据
newData = [{
"30 Apr 2017BDT",
"1.00000",
"0.0",
"0.01107",
"0.1"
}, {
"29 Apr 2017BDT",
"1.00000",
"0.0",
"0.01107",
"-0.5"
}];我需要一个建议或帮助如何解决这个问题。
发布于 2020-04-08 09:26:40
您的预期输出看起来不是一个有效的JS。但是,您可以通过使用.reduce()、.map()和Object.entries()等几种方法迭代数组来获得数组。
const data = [
{ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
{ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"},
{ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
{ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}
];
const result = Object.entries(
data.reduce((r, {ReportTime, ...rest}) => {
r[ReportTime] = (r[ReportTime] || []).concat(Object.values(rest));
return r;
}, {})
).map(([k, v]) => [k, ...v]);
console.log(result);.as-console-wrapper { max-height: 100% !important; top: 0; }
下面是使用es5(旧的)语法的另一种方法:
var data = [
{ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
{ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"},
{ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"},
{ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}
];
var key = 'ReportTime';
var reducer = function(data, key) {
var result = [];
var map = {};
data.forEach(function(o, i) {
map[o[key]] = map[o[key]] || [];
for(var k in o) {
if(!(k === key)) { map[o[key]].push(o[k]); }
};
});
for(var j in map) {
result.push([].concat(j, map[j]));
};
return result;
};
console.log(reducer(data, key));
发布于 2020-04-08 09:25:36
可以通过ReportTime将值归为组。
const data = [{ ReportTime: "30 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"}, { ReportTime: "30 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "0.1"}, { ReportTime: "29 Apr 2017BDT", Rate: "1.00000", AvgGrowth: "0.0"
}, { ReportTime: "29 Apr 2017BDT", Rate: "0.01107", AvgGrowth: "-0.5"}]
const merged = data.reduce((op, inp) => {
let key = inp.ReportTime
op[key] = op[key] || []
op[key].push(inp)
return op
}, Object.create(null))
console.log(merged)
发布于 2020-04-08 09:29:42
我认为,如果将group变成具有维护速率和AvgGrowth的对象,将很有帮助。
检查项目,构建一个带有键的对象,其名称为"ReportTime“。当ReportTime已经存在于对象中时,只需更新速率和AvgGrowth。迭代之后,获取上述对象的Object.values()作为数组。
const update = data => {
const res = {};
data.forEach(item => {
if (!res[item.ReportTime]) {
res[item.ReportTime] = {
ReportTime: item.ReportTime,
Rate: [],
AvgGrowth: []
};
}
res[item.ReportTime].Rate.push(item.Rate);
res[item.ReportTime].AvgGrowth.push(item.AvgGrowth);
});
return Object.values(res);
};
var data = [
{
ReportTime: "30 Apr 2017BDT",
Rate: "1.00000",
AvgGrowth: "0.0"
},
{
ReportTime: "30 Apr 2017BDT",
Rate: "0.01107",
AvgGrowth: "0.1"
},
{
ReportTime: "29 Apr 2017BDT",
Rate: "1.00000",
AvgGrowth: "0.0"
},
{
ReportTime: "29 Apr 2017BDT",
Rate: "0.01107",
AvgGrowth: "-0.5"
}
];
console.log(update(data));
https://stackoverflow.com/questions/61097200
复制相似问题