Получить сумму столбцов, если значения других столбцов совпадают - PullRequest
0 голосов
/ 18 мая 2018

У меня есть проблема матричного алгоритма:

Ввод:

const testObj = [
 ['Anna', 10, 'Monday'],
 ['Anna', 15, 'Wednesday'],
 ['Beatrice', 8, 'Monday'],
 ['Beatrice', 11, 'Wednesday'],
 ['Anna', 4, 'Wednesday'],
 ['Beatrice', 5, 'Monday'],
 ['Beatrice', 16, 'Monday']
]

Выход:

let resultObj = [
 ['Anna', 10, 'Monday'],
 ['Beatrice', 11, 'Wednesday'],
 ['Anna', 19, 'Wednesday'],
 ['Beatrice', 27, 'Monday']
]

В основном, если это один и тот же человек (col0) ив тот же день (col2), получите сумму col1 и объедините.

Я решаю это с помощью javascript, но подойдет любое предложение на любом языке.Я сделал это:

const solveThis = async(obj) => {
 for (let i = 0; i < obj.length; i += 1) {
  if (obj[i + 1] && (obj[i][0] === obj[j][0]) && (obj[i][2] === obj[j][2])) {
   let sum = obj[i][1] + obj[j][1],
       newRow = new Array(obj[i + 1][0], sum, obj[i + 1][2])
   obj.push(newRow)
   let indexi = obj.indexOf(obj[i]),
       indexj = obj.indexOf(obj[j])
   obj.splice(indexi, 1)
   obj.splice(indexj, 1
  }
 }
  return obj
}

solveThis(testObj).then(result => console.log(result))

и это не работает.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вы можете использовать метод массива .reduce для создания нового массива.Для каждого элемента используйте .find, чтобы увидеть, существует ли элемент с соответствующим именем и днем.Если это так, добавьте значения, в противном случае поместите элемент в новый массив.

Пример:

const testObj = [
 ['Anna', 10, 'Monday'],
 ['Anna', 15, 'Wednesday'],
 ['Beatrice', 8, 'Monday'],
 ['Beatrice', 11, 'Wednesday'],
 ['Anna', 4, 'Wednesday'],
 ['Beatrice', 5, 'Monday'],
 ['Beatrice', 16, 'Monday']
];

function merge(arr) {
  return arr.reduce((merged, item) => {
    const existing = merged.find(o => o[0] === item[0] && o[2] === item[2]);
    existing
      ? existing[1] += item[1]
      : merged.push(item);
      
    return merged;
  }, []);
}

console.log(merge(testObj));
0 голосов
/ 18 мая 2018

Сначала создайте объект с помощью клавиш name|day, а затем получите значения.

const data = [['Anna', 10, 'Monday'],['Anna', 15, 'Wednesday'],['Beatrice', 8, 'Monday'],['Beatrice', 11, 'Wednesday'],['Anna', 4, 'Wednesday'],['Beatrice', 5, 'Monday'],['Beatrice', 16, 'Monday']]

const result = data.reduce((r, [name, v, day]) => {
  const key = `${name}|${day}`;
  if(!r[key]) r[key] = [name, v, day];
  else r[key][1] += v;
  return r;
}, {})

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