将值合并到一个二维数组中

merge values together in a 2d array

在尝试合并二维数组中的值时遇到一点问题。

例如:

const formatBids = 
 [
   [4444, 10000],
   [4444, 500],
   [4455, 500],
 ];

如果第一个参数相同,我想对数组的第二个参数求和,所以最终结果是:

 [
   [4444, 10500],
   [4455, 500],
 ];

我尝试了以下方法,但它不断地自我添加产生了错误的结果:

formatBids.map(bid => {
  const map = new Map([bid]);
  formatBids.forEach(arr => (arr[1] += map.get(arr[0]) ?? 0));
});

不确定解决此问题的最佳方法。想法?

您可以只将对象用作一种映射,并将数组中的第一项用作键。然后您可以使用 Object.entries() 将其转换回数组。像这样:

const formatBids = 
 [
   [4444, 10000],
   [4444, 500],
   [4455, 500],
 ];
 
const totals = {}

for (const bid of formatBids) {
  totals[bid[0]] = (totals[bid[0]] || 0) + bid[1];
}

console.log("as object:", totals, "as array:", Object.entries(totals));

const formatBids = [
  [4444, 10000],
  [4444, 500],
  [4455, 500],
];

let merged = {}

formatBids.forEach((ele) => {
  let key = parseInt(ele[0]);
   merged[key] = (merged[key] ?? 0)+ele[1];
})

let mergedArr = Object.entries(merged);
console.log(mergedArr)

这是另一种方法

  1. 根据第一个索引对数组进行排序
  2. 如果 currentArr(merged Array) 为空,则推入数组。
  3. 如果不为空,则检查currentArr最后一个索引处的第一个元素是否等于CurrentElement的第一个索引。
    • 如果是,则将第2个元素值加到currentArr的[n-1][1]
    • 否则,将 currentElement 插入 currentArr

const formatBids = [
  [4444, 10000],
  [4444, 500],
  [4455, 500],
];
var mergedArr = formatBids.sort().reduce((currentArr, currentElement) => {
  let n = currentArr.length;
  if (n === 0) return [currentElement];

  if (currentElement[0] === currentArr[n - 1][0]) {
    currentArr[n - 1][1] += currentElement[1];
    return currentArr;
  } else return [...currentArr, currentElement];
}, []);
console.log(mergedArr)

const formatBids = 
 [
   [4444, 10000],
   [4444, 500],
   [4455, 500],
 ];
 
const result = Object.entries(formatBids.reduce((acc, [key, value]) => {
   if (!acc[key]) acc[key] = value;
   else acc[key] += value;
   return acc;
}, {}));

console.log(result);