Объединять уникальные элементы массива массивов при суммировании значений - JS / lodash - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть массив, который выглядит примерно так:

currArray = 
 [ 
  ['a', 2],
  ['b', 3],
  ['c', 5],
  ['a', 2],
  ['b', 4],
  ['d', 6]
 ]

Я пытаюсь объединить массивы с одинаковым значением в [0], добавляя значения в [1]. Таким образом, результат будет выглядеть следующим образом:

newArray = 
 [ 
  ['a', 4], 
  ['b', 7], 
  ['c', 5], 
  ['d', 6] 
 ]

В настоящее время пробуем это через Vanilla JavaScript и loda sh.

Любой совет очень ценится.

Ответы [ 4 ]

3 голосов
/ 14 февраля 2020

Вы можете использовать Array.reduce():

const currArray = [
  ['a', 2],
  ['b', 3],
  ['c', 5],
  ['a', 2],
  ['b', 4],
  ['d', 6]
];

const result = currArray.reduce((res, [key, val]) => {
  const correspondingArr = res.find(arr => arr[0] === key);
  if (correspondingArr) {
    correspondingArr[1] += val;
  } else {
    res.push([key, val]);
  }
  return res;
}, []);

console.log(result);
2 голосов
/ 14 февраля 2020

Вы можете использовать _.groupBy() с _.head(), чтобы сгруппировать все записи с одним и тем же первым элементом. Затем сопоставьте группы и суммируйте (с _.sumBy() и _.last()) 2-е элементы каждой группы:

const currArray = [["a",2],["b",3],["c",5],["a",2],["b",4],["d",6]]

const result = _.map(
  _.groupBy(currArray, _.head), // group by the 1st item
  (group, key) => [key, _.sumBy(group, _.last)] // take the key from each group, and sum all the 2nd items of each group
)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

С помощью lodash / fp вы можете создать функцию с _.flow(), которая группирует элементы по 1-му элементу, суммирует 2-й элемент каждой группы и конвертирует к записям:

const { flow, groupBy, head, mapValues, sumBy, last, toPairs } = _

const fn = flow(
  groupBy(head), // group by the 1st item
  mapValues(sumBy(last)), // take the key from each group, and sum all the 2nd items of each group
  toPairs // convert to entries
)

const currArray = [["a",2],["b",3],["c",5],["a",2],["b",4],["d",6]]

const result = fn(currArray)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
2 голосов
/ 14 февраля 2020

Мы можем использовать хеш-карты для хранения суммы, а затем сопоставить хеш-карту с массивом.

currArray = 
 [ 
  ['a', 2],
  ['b', 3],
  ['c', 5],
  ['a', 2],
  ['b', 4],
  ['d', 6]
 ]

// create a hash map
const currArrInfo = {};

// fill the hash map
currArray.forEach((miniArray) => {
    currArrInfo[miniArray[0]] = currArrInfo[miniArray[0]] || 0;
    currArrInfo[miniArray[0]]+=currArrInfo[miniArray[1]];
});

// map the hash map to array
currArray = Object.keys(currArrInfo).map((key) => [key, currArrInfo[key]]);
1 голос
/ 14 февраля 2020

Вы можете использовать Карта , чтобы вести счет для каждого отличающегося currArray[0]:

currArray = 
 [ 
  ['a', 2],
  ['b', 3],
  ['c', 5],
  ['a', 2],
  ['b', 4],
  ['d', 6]
 ];
 
 let map = new Map();
 currArray.forEach(function(subAry)
 {
  let runningTally = map.get(subAry[0]);
  if (runningTally)
  {
    map.set(subAry[0],runningTally + subAry[1]);
  }
  else
  {
    map.set(subAry[0],subAry[1]);
  }
 });
 let newArray = Array.from(map);
 console.log(newArray);
...