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