Возникла небольшая проблема с попыткой объединить значения в 2d-массиве.

Например:

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

Не уверен, что лучший способ решить эту проблему. Идеи?

0
Mubeen Hussain 24 Янв 2022 в 16:02
formatBids.map() всегда будет возвращать массив с 3 элементами, если formatBids содержит 3 элемента.
 – 
Bergi
24 Янв 2022 в 16:08
Старайтесь не изменять входные данные, а вместо этого создайте новый массив результатов.
 – 
Bergi
24 Янв 2022 в 16:09
Я думаю, вы должны использовать объект вместо 2d-массива для хранения данных. Из сообщения я думаю, что 0-й элемент вложенного массива уникален. Так что, возможно, что-то вроде этого может помочь jsfiddle.net/xgfdhw5r/1
 – 
Rahul Padalkar
24 Янв 2022 в 16:15

3 ответа

Лучший ответ

Вы можете просто использовать объект как своего рода карту и использовать первый элемент массива в качестве ключа. Затем вы можете преобразовать его обратно в массив, используя 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));
5
Michael Beeson 24 Янв 2022 в 16:16
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 (объединенный массив) пуст.
  3. Если не пусто, то проверьте, что первый элемент в последнем индексе currentArr равен первому индексу CurrentElement.
    • если да, добавьте значение второго элемента в currentArr's[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)
0
Himanshu Singh 24 Янв 2022 в 16:24
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);
0
James 24 Янв 2022 в 16:27