在 Javascript 中的多维数组中合并具有相同日期的值
Combine value with same date in multidimensional array in Javascript
我有一个数组,它有两个值,一个日期和一个金额,但在不同的索引处有相同的日期和不同的值,所以我需要将这些值合并到多维中的相同日期 javascript数组
当前数组
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
预期结果数组
var arry = [
['2021-05-01',850],
['2021-05-02',600],
['2021-05-03',200],
['2021-05-04',120]]
有人可以帮忙吗?非常感谢您提供的任何帮助。
这是一个使用 reduce
的解决方案。我正在创建一个按日期分组的对象并获取它的值数组
var arry = [['2021-05-01',100], ['2021-05-02',300], ['2021-05-03',200], ['2021-05-01',150],['2021-05-02',300], ['2021-05-01',600],['2021-05-04',120]]
const res = Object.values(arry.reduce((acc,[date,val])=> {
acc[date] = acc[date] || [date,0]
acc[date][1]+=val
return acc
},{}))
console.log(res)
您可以使用reduce
方法:
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
];
const data = arry.reduce((list, [date, value]) => {
list[date] = (list[date] ?? 0) + value;
return list;
}, {});
const list = Object.entries(data); // if you want the array
console.log(list);
您可能只是循环遍历列表,并在列表中的每个值处检查之前出现的所有值,看它是否重复。像下面这样的东西会起作用:
var array = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
var newArray = []; // where we will put the new merged values
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray++) {
// check all previous values in newArray up to this point:
var checkNewArray; // declare out here for logic post loop
for (checkNewArray = 0; checkNewArray < newArray.length; checkNewArray++) {
if (array[lookAtOldArray][0] == newArray[checkNewArray][0]) {
// add to newArray number:
newArray[checkNewArray][1] += array[lookAtOldArray][1];
break; // BREAK to signify we found a position
}
// otherwise keep looking
}
// because of the break, if checkNewArray == newArray.length, then we DID NOT find a duplicate (AKA: push to newArray with exact value in array)
if (checkNewArray == newArray.length) {
newArray.push(array[lookAtOldArray]);
}
}
另一个有趣的想法是使用对象。上述策略需要查看数据的次数超过必要次数(最坏情况下为 n^2)。对于对象,您可以使用日期作为键,使用数字作为值。有了它,你可以做这样的事情(假设相同的声明 array
:
var combinedDates = {};
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray++) {
combinedDates[array[lookAtOldArray][0]] += array[lookAtOldArray[1];
}
您可以看出这要快得多,也简单得多。生成的对象将如下所示:
{
"2021-05-01": 850,
"2021-05-02": 600,
"2021-05-03": 200,
"2021-05-04": 120
}
我更喜欢第二个,效率更高;您只需要查看初始数组中的每个元素 一次 (导致 n
或线性时间复杂度)!
如果你想把上面的对象组合成一个数组,你可以这样做:
// get object keys
var objectKeys = Object.keys(combinedDates);
var newArray = [];
// loop through keys
for (var makeObject = 0; makeObject < objectKeys.length; makeObject++) {
// create array with key (the date) and the number (the value stored at the key):
newArray.push([objectKeys[makeObject][0], combinedDates[objectKeys[makeObject]]);
}
我有一个数组,它有两个值,一个日期和一个金额,但在不同的索引处有相同的日期和不同的值,所以我需要将这些值合并到多维中的相同日期 javascript数组
当前数组
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
预期结果数组
var arry = [
['2021-05-01',850],
['2021-05-02',600],
['2021-05-03',200],
['2021-05-04',120]]
有人可以帮忙吗?非常感谢您提供的任何帮助。
这是一个使用 reduce
的解决方案。我正在创建一个按日期分组的对象并获取它的值数组
var arry = [['2021-05-01',100], ['2021-05-02',300], ['2021-05-03',200], ['2021-05-01',150],['2021-05-02',300], ['2021-05-01',600],['2021-05-04',120]]
const res = Object.values(arry.reduce((acc,[date,val])=> {
acc[date] = acc[date] || [date,0]
acc[date][1]+=val
return acc
},{}))
console.log(res)
您可以使用reduce
方法:
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
];
const data = arry.reduce((list, [date, value]) => {
list[date] = (list[date] ?? 0) + value;
return list;
}, {});
const list = Object.entries(data); // if you want the array
console.log(list);
您可能只是循环遍历列表,并在列表中的每个值处检查之前出现的所有值,看它是否重复。像下面这样的东西会起作用:
var array = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
var newArray = []; // where we will put the new merged values
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray++) {
// check all previous values in newArray up to this point:
var checkNewArray; // declare out here for logic post loop
for (checkNewArray = 0; checkNewArray < newArray.length; checkNewArray++) {
if (array[lookAtOldArray][0] == newArray[checkNewArray][0]) {
// add to newArray number:
newArray[checkNewArray][1] += array[lookAtOldArray][1];
break; // BREAK to signify we found a position
}
// otherwise keep looking
}
// because of the break, if checkNewArray == newArray.length, then we DID NOT find a duplicate (AKA: push to newArray with exact value in array)
if (checkNewArray == newArray.length) {
newArray.push(array[lookAtOldArray]);
}
}
另一个有趣的想法是使用对象。上述策略需要查看数据的次数超过必要次数(最坏情况下为 n^2)。对于对象,您可以使用日期作为键,使用数字作为值。有了它,你可以做这样的事情(假设相同的声明 array
:
var combinedDates = {};
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray++) {
combinedDates[array[lookAtOldArray][0]] += array[lookAtOldArray[1];
}
您可以看出这要快得多,也简单得多。生成的对象将如下所示:
{
"2021-05-01": 850,
"2021-05-02": 600,
"2021-05-03": 200,
"2021-05-04": 120
}
我更喜欢第二个,效率更高;您只需要查看初始数组中的每个元素 一次 (导致 n
或线性时间复杂度)!
如果你想把上面的对象组合成一个数组,你可以这样做:
// get object keys
var objectKeys = Object.keys(combinedDates);
var newArray = [];
// loop through keys
for (var makeObject = 0; makeObject < objectKeys.length; makeObject++) {
// create array with key (the date) and the number (the value stored at the key):
newArray.push([objectKeys[makeObject][0], combinedDates[objectKeys[makeObject]]);
}