Как объединить массив двумерных чисел на основе первых элементов внутреннего подмассива? - PullRequest
0 голосов
/ 26 декабря 2018

С учетом 2d-массива [[2, 12], [3, 12], [3, 15], [5, 15]] .

Я хотел бы проверить, равен ли первый элемент подмассива первому элементу соседа.И если они равны, я хотел бы суммировать их вторые элементы и заменить эти 2 новым массивом.

Таким образом, выходные данные должны быть: [[2, 12], [3, 27], [5, 15]] .

Спасибо!Я пробовал обычный цикл for, но он выдает ошибку TypeError, говоря, что не может получить доступ к значению undefined

for (let i = 0; i < arr.length; i++) {
     if (arr[i][0] === arr[i+1][0]) console.log( arr[i] );
}

TypeError: Cannot read property '0' of undefined
at evalmachine.<anonymous>:5:29
at Script.runInContext (vm.js:74:29)
at Object.runInContext (vm.js:182:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
at ReadStream.Readable.push (_stream_readable.js:218:10)
at fs.read (fs.js:2124:12)

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Вы можете уменьшить массив и взять вспомогательную переменную для последнего нажатого элемента набора результатов;

var array = [[2, 12], [3, 12], [3, 15], [5, 15]],
    grouped = array.reduce((last => (r, a) => {
        if (last && last[0] === a[0]) {
            last[1] += a[1];
        } else {
            r.push(last = a);
        }
        return r;
    })(), []);

console.log(grouped);
0 голосов
/ 26 декабря 2018

Вы можете сделать что-то подобное, используя reduce

Проверьте, имеет ли последний элемент accumulator тот же key, что и текущий элемент в контексте.Если да, то суммируйте value частей.В противном случае нажмите на элемент accumulator

const data = [[2, 12], [3, 12], [3, 15], [5, 15]];

const newArray = data.reduce((acc, a, i) => {
  if (i > 0 && a[0] === data[i-1][0])
    acc[acc.length-1][1] += a[1]
  else
    acc.push(a);
  return acc
}, [])

console.log(newArray)

Приведенная выше логика с использованием троичных и операторов запятой

const data = [[2, 12], [3, 12], [3, 15], [5, 15]];

const newArray = data.reduce((acc, a, i) => (
    i > 0 && a[0] === data[i-1][0]
     ? acc[acc.length-1][1] += a[1]
     : acc.push(a), acc), [])

console.log(newArray)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...