如何根据需求将嵌套的数组项处理并组合成一个新的结构?
How does one process and combine nested array items into a new structure based on requirements?
我正在尝试对数组的索引求和并将它们保存到一个新数组中。
我在下面包含了一个示例数组,以及我第一次尝试解决这个问题:
var data = [
["29.01.2020", 40, 10],
["30.01.2020", 80, 100],
["31.01.2020", 90, 500],
["01.02.2020", 30, 205],
["02.02.2020", 10, 74],
["03.02.2020", 30, 120]
];
我尝试创建的结果类似于这些(数组或对象):
[['0120', 210, 610], ['0220', 70, 399]]
{
"0120": {
"abc": 210,
"def": 610
},
"0220": {
"abc": 70,
"def": 399
}
}
这是我发现并正在尝试的东西,也许可以通过一些编辑来实现:
var res = {};
data.forEach((item)=>{
if(Object.keys(res).includes(item[0])){
res[item[1]] += item[1];
} else {
res[item[0]] = item[1];
}
});
我猜应该可以通过使用子字符串来缩短我的数据数组的第一个索引?我主要努力的是让它总结索引。
有什么办法可以到达那里吗?
提前致谢
首先,您可以使用String.split
函数从每个子数组的第一个元素中获取键。使用split
函数,可以提取月份和年份字符串并组合生成每个数组的key
。
并基于该密钥,使用 Array.prototype.reduce
,您可以生成您想要的内容。
const data = [
["29.01.2020", 40, 10],
["30.01.2020", 80, 100],
["31.01.2020", 90, 500],
["01.02.2020", 30, 205],
["02.02.2020", 10, 74],
["03.02.2020", 30, 120]
];
const result = data.reduce((acc, cur) => {
const dateArr = cur[0].split('.');
const key = dateArr[1] + dateArr[2].slice(-2);
if (acc[key]) {
acc[key].abc += cur[1];
acc[key].def += cur[2];
} else {
acc[key] = {
abc: cur[1],
def: cur[2]
};
}
return acc;
}, {});
console.log(result);
您可以使用array reduce方法。按点拆分日期字符串。然后将其设为密钥(根据您的要求,月份中的两位数和年份中的最后两位数)并根据该密钥计算它。最后使用Object.values输出数组。
const data = [
['29.01.2020', 40, 10],
['30.01.2020', 80, 100],
['31.01.2020', 90, 500],
['01.02.2020', 30, 205],
['02.02.2020', 10, 74],
['03.02.2020', 30, 120],
];
const ret = data.reduce((prev, c) => {
const p = prev;
const date = c[0].split('.');
const key = `${date[1]}${date[2].slice(-2)}`;
if (!p[key]) p[key] = [key, c[1], c[2]];
else p[key] = [key, p[key][1] + c[1], p[key][2] + c[2]];
return p;
}, {});
console.log(Object.values(ret));
我正在尝试对数组的索引求和并将它们保存到一个新数组中。
我在下面包含了一个示例数组,以及我第一次尝试解决这个问题:
var data = [
["29.01.2020", 40, 10],
["30.01.2020", 80, 100],
["31.01.2020", 90, 500],
["01.02.2020", 30, 205],
["02.02.2020", 10, 74],
["03.02.2020", 30, 120]
];
我尝试创建的结果类似于这些(数组或对象):
[['0120', 210, 610], ['0220', 70, 399]]
{
"0120": {
"abc": 210,
"def": 610
},
"0220": {
"abc": 70,
"def": 399
}
}
这是我发现并正在尝试的东西,也许可以通过一些编辑来实现:
var res = {};
data.forEach((item)=>{
if(Object.keys(res).includes(item[0])){
res[item[1]] += item[1];
} else {
res[item[0]] = item[1];
}
});
我猜应该可以通过使用子字符串来缩短我的数据数组的第一个索引?我主要努力的是让它总结索引。
有什么办法可以到达那里吗? 提前致谢
首先,您可以使用String.split
函数从每个子数组的第一个元素中获取键。使用split
函数,可以提取月份和年份字符串并组合生成每个数组的key
。
并基于该密钥,使用 Array.prototype.reduce
,您可以生成您想要的内容。
const data = [
["29.01.2020", 40, 10],
["30.01.2020", 80, 100],
["31.01.2020", 90, 500],
["01.02.2020", 30, 205],
["02.02.2020", 10, 74],
["03.02.2020", 30, 120]
];
const result = data.reduce((acc, cur) => {
const dateArr = cur[0].split('.');
const key = dateArr[1] + dateArr[2].slice(-2);
if (acc[key]) {
acc[key].abc += cur[1];
acc[key].def += cur[2];
} else {
acc[key] = {
abc: cur[1],
def: cur[2]
};
}
return acc;
}, {});
console.log(result);
您可以使用array reduce方法。按点拆分日期字符串。然后将其设为密钥(根据您的要求,月份中的两位数和年份中的最后两位数)并根据该密钥计算它。最后使用Object.values输出数组。
const data = [
['29.01.2020', 40, 10],
['30.01.2020', 80, 100],
['31.01.2020', 90, 500],
['01.02.2020', 30, 205],
['02.02.2020', 10, 74],
['03.02.2020', 30, 120],
];
const ret = data.reduce((prev, c) => {
const p = prev;
const date = c[0].split('.');
const key = `${date[1]}${date[2].slice(-2)}`;
if (!p[key]) p[key] = [key, c[1], c[2]];
else p[key] = [key, p[key][1] + c[1], p[key][2] + c[2]];
return p;
}, {});
console.log(Object.values(ret));