【问题标题】:(JavaScript) Get the sum of alternate values in array and get the maximum value from it(JavaScript) 获取数组中交替值的总和并从中获取最大值
【发布时间】:2020-01-22 04:03:14
【问题描述】:

我在一个数组中有 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'],
}];

数据是一个月中日期值的表示(因此它们的长度相同)。我想要的是获取每个日期的备用数据值的总和并从中获取最大值。

Alternate 在这里表示例如:待处理的第 0 个索引的值为 5,类似地,已交付为 10,失败为 15。它们的总和为 30。在这里,上面例子中的最大值是500 在对它们求和后的第 4 个索引上,这就是我想要的。

我怎样才能做到这一点?

【问题讨论】:

  • monthStats 长度将是 3?
  • 是的,永远是 3
  • “替代数据的值的总和”“替代”是什么意思?从您的示例来看,“全部”似乎比“替代”更合适。我弄错了吗?
  • @Stratubas 我已经更新了细节。请在上面检查。
  • @Vectrobyte 1) 在 javascript 中,数组索引从 0 开始。因此,5、10 和 15 位于 0 索引处。 2)“失败”数组,0索引处的第一个值是15。4索引处的第五个值不是150。它是0。所以看起来你的最大值不是500,而是350。跨度>

标签: javascript arrays object


【解决方案1】:
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}`)

【讨论】:

    【解决方案2】:

    假设待处理、已交付和失败的对象保持该顺序(这不是一个好习惯,但是.. 很好)。

    您可以简单地将数据数组的每个值的元素相加,然后获取该和的最大值,然后获取该最大值的索引。

    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);

    【讨论】:

      【解决方案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', '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)

      【讨论】:

        【解决方案4】:

        我的做法:

        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);

        【讨论】:

          【解决方案5】:

          您可以使用.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));

          【讨论】:

          • @Vectrobyte 你想要最大的金额吗?我已经修改了我的答案以返回
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-16
          • 2021-11-29
          • 2011-10-04
          相关资源
          最近更新 更多