(JavaScript) Получить сумму альтернативных значений в массиве и получить из нее максимальное значение - PullRequest
5 голосов
/ 22 января 2020

У меня есть 3 объекта в массиве, в которых все они имеют одинаковое количество свойств данных. Данные следующие:

const monthStats = [{
  name: 'pending',
  data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'delivered',
  data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'failed',
  data: ['15', '33', '30', '2', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}];

Данные представляют собой значения дат в месяце (поэтому они имеют одинаковую длину). Я хочу получить сумму значений альтернативных данных каждой даты и получить из нее максимальное значение.

Альтернатива здесь означает, например: при ожидании 0-й индекс имеет значение 5, аналогично при доставке - 10 и при неудаче - 15. Их общая сумма составляет 30. Здесь максимальное значение в приведенном выше примере составляет 500 для 4-го индекса после их суммирования, и это то, что я хочу.

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

Ответы [ 5 ]

4 голосов
/ 22 января 2020
Here is what you want as per my understanding:

const monthStats = [{
  name: 'pending',
  data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'delivered',
  data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'failed',
  data: ['15', '33', '30', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}];
let index=0;
let max=0;
for(let i=0;i<monthStats[0].data.length;i++){
let sum=+monthStats[0].data[i]+ +monthStats[1].data[i]+ +monthStats[2].data[i]
if(max<sum){
max=sum
index=i
}
}
console.log(`Max sum is ${max} at index ${index}`)
3 голосов
/ 22 января 2020

Предполагая, что ожидающие, доставленные и потерпевшие неудачу объекты остаются в таком порядке (что не является хорошей практикой, но ... хорошо).

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

const monthStats = [{
  name: 'pending',
  data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'delivered',
  data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'failed',
  data: ['15', '33', '30', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}];

const monthTotals = monthStats[0].data.map((pend, pIndex) => Number(pend) + Number(monthStats[1].data[pIndex]) + Number(monthStats[2].data[pIndex]));

const maxMonthTotal = Math.max(...monthTotals);
const maxMonthTotalIndex = monthTotals.findIndex(monthTotal => maxMonthTotal === monthTotal);
console.log('MonthStats the max is: ', maxMonthTotal, ' on the position: ', maxMonthTotalIndex + 1)

console.log('MonthStats totals', monthTotals);
2 голосов
/ 22 января 2020

Мой подход:

const monthStats = [{
  name: 'pending',
  data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'delivered',
  data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
  name: 'failed',
  data: ['15', '33', '30', '2', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}];

const dataArrays = monthStats.map(type => type.data.map(str => parseFloat(str)));

let bestSum = 0;
let bestDay = 0;
for (let day = 0; day < dataArrays[0].length; day++) {
  const daySum = dataArrays.reduce((daySumAccumulator, typeData) => {
    return daySumAccumulator + typeData[day];
  }, 0);
  if (daySum > bestSum) {
    bestSum = daySum;
    bestDay = day;
  }
}
console.log('Best sum is', bestSum, 'and was found at day', bestDay);
2 голосов
/ 22 января 2020

Вы можете отобразить каждый массив данных в отдельный массив, используя .map(), чтобы отделить его от вашего объекта. Затем вы можете сжать все ваши массивы данных, чтобы получить массивы, содержащие элементы из одного индекса. Затем вы можете суммировать каждый из этих сжатых массивов, используя .map() и .reduce(). Наконец, вы можете найти максимум, распространив результаты на Math.max():

const monthStats = [{name: 'pending', data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], }, { name: 'delivered', data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], }, { name: 'failed', data: ['15', '33', '30', '2', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'], }];

const zip = arrs => arrs[0].map((_,c)=>arrs.map(arr=>arr[c]));
const data = zip(monthStats.map(({data}) => data));
const sums = data.map(arr => arr.reduce((acc, n) => acc + +n, 0));
const biggest = Math.max(...sums);
console.log("Biggest sum is:", biggest, "at index:", sums.indexOf(biggest));
2 голосов
/ 22 января 2020

Попробуйте это:

 const monthStats = [{
    name: 'pending',
    data: ['5', '1', '2', '3', '100', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '20', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
    name: 'delivered',
    data: ['10', '44', '12', '0', '250', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '180', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}, {
    name: 'failed',
    data: ['15', '33', '30', '150', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '50', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0'],
}];
let max = 0;
monthStats[0].data.map((v, i) => {
    let sum = [monthStats[0].data[i], monthStats[1].data[i], monthStats[2].data[i]].reduce((v1, v2) => {
        return parseInt(v1) + parseInt(v2);
    })
    if (sum > max) {
        max = sum;
    }
})
console.log(max)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...