Поиск дубликатов в массиве массивов и их обработка - PullRequest
0 голосов
/ 25 октября 2018

Наличие данных в массиве массивов с дублирующимися массивами O-й позиции. объяснение Сравните массивы с нулевой позицией и получите точный результат.

let array = [["2018-03-09", 10, 11, 0],["2018-03-10", 100, 101, 105],["2018-03-15", 20, 0, 25],["2018-03-09", 0, 0, 15],["2018-03-15", 0, 10, 0]]
let output = [];
for (let i = 0; i < array.length; i++) {
  let key = array[i][0]
  let index = output.findIndex(x => x[0] == key)
  if (index >= 0) {
    for (let k = 1; k < array[i].length; k++) {
      if (array[i][k] >= output[index][i]) {

        output[index][k] = array[i][k]
      } else {
        output[index][k] = output[index][i]
      }

    }
  } else {
    output.push(array[i])
  }
}
console.log(output)

Требуемый вывод

output=[["2018-03-09",10,11,15],["2018-03-10",100,101,105],["2018-03-15",20,10,25]]

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Для лучшей читабельности вы можете обновить массив в отдельной функции (я сохранил использованный вами метод цикла for, хотя мы могли бы использовать здесь вызов forEach()).

Здесь updateEntry будетпосмотрите в выходном массиве (entries аргумент) существующий entry, обновив его, если он найден, иначе он добавит его в выходной массив.

под рабочим фрагментом.

function updateEntry(entries, entry) {
  for (let i = 0; i < entries.length; i++) {
    if (entry[0] != entries[i][0]) continue;
    for (let j = 1; j < entry.length; j++) {
      if (entry[j] >= entries[i][j])
        entries[i][j] = entry[j];
    }
    return;
  }
  entries.push(entry);
}

let array = [
  ["2018-03-09", 10, 11, 0],
  ["2018-03-10", 100, 101, 105],
  ["2018-03-15", 20, 0, 25],
  ["2018-03-09", 0, 0, 15],
  ["2018-03-15", 0, 10, 0]
];
let output = [];
for (let i = 0; i < array.length; i++) {
  updateEntry(output, array[i]);
}

console.log(output);
0 голосов
/ 25 октября 2018

Используйте array.reduce для создания объекта с идентификатором (датой) в качестве ключей, который суммирует остальные три значения.Затем используйте Object.values ​​для возврата желаемого вывода массива.

let array = [["2018-03-09", 10, 11, 0],["2018-03-10", 100, 101, 105],["2018-03-15", 20, 0, 25],["2018-03-09", 0, 0, 15],["2018-03-15", 0, 10, 0]];

let output = Object.values(array.reduce((r, e) => {
  var k = e[0];
  
  if (!r[k]) r[k] = [k, 0, 0, 0];

  r[k][1] += e[1];
  r[k][2] += e[2];
  r[k][3] += e[3];
 
  return r;
}, {}));

console.log(output);
0 голосов
/ 25 октября 2018

Вы можете использовать объект поиска, чтобы найти предыдущие записи с теми же значениями, а затем объединить их.Деструктуризация массива помогает сделать код чистым:

 const byDate = {};
 const result = [];

 for(const [date, ...values] of array) {
  if(byDate[date]) {
    values.forEach((v, i) => byDate[date][i + 1] = Math.max(byDate[date][i + 1], v));
  } else {
    result.push(byDate[date] = [date, ...values]);
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...