【问题标题】:calculate the average : "TypeError: reduce of empty array with no initial value"计算平均值:“TypeError:减少没有初始值的空数组”
【发布时间】:2018-06-21 10:00:35
【问题描述】:

这是我计算对象数组平均值的函数。 但是如果 myData 为空(没有对象),我有“TypeError: reduce of empty array with no initial value”

var myData = [{"fruit1": 2,"fruit2": 2,"fruit3": 1},{"fruit1": 2,"fruit2": 1,"fruit3": 1}];
var average =[];
                    var average = myData.reduce(function(a, b, index, self) {

                        var keys = Object.keys(a) ;
                        var c = {};

                        keys.map(function(key) {

                            c[key] = (a[key] + b[key] ) ;
                                if (index + 1  === self.length ) {
                                    c[key] =( c[key] / self.length );
                            }
                                        });

                        return c ;
                    });

【问题讨论】:

  • 所以,提供一个初始值,或者检查数组是否为空。您希望默认平均值是多少?

标签: javascript arrays object average


【解决方案1】:

问题可能是您的objectServices2 中没有如下元素:

let objectServices2 = [];

如果该值来自某些服务,您可能需要检查它为什么为空。

另一个修复可以提供如下所示的默认值

var average = objectServices2.reduce(function(a, b, index, self) {

  var keys = Object.keys(a) ;
  var c = {};


  keys.map(function(key) {
    c[key] = a[key] + b[key] |0 ;

    if (index + 1 === self.length ) {
      c[key] = c[key] / self.length ;
    }
  });

   return c ;
 },123);//  <=====here

【讨论】:

    【解决方案2】:

    您的问题是您缺少 reduce 函数的初始值。

    根据 mdn:

    reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,以将其减少为单个值。

    那个累加器是函数之前执行的值,但是对于数组的第一个值,你必须提供初始值。

    如果您的 reduce 函数的输出是一个对象,您可能希望使用一个空对象 {} 来初始化该函数。如果它是一个数字,可能是0,如果你想返回一个字符串,一个合理的值可能是一个空字符串:''。这完全取决于您在计算什么。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

    var average = objectServices2
        .reduce(function(accumulator, currentValue, currentIndex, array) {
             // do your work here
        }, initialValue);
    

    【讨论】:

      【解决方案3】:

      一个更简单的替代方法,循环遍历数组中对象的每个项目并计算平均值:

      var myData = [{"fruit1": 2,"fruit2": 2,"fruit3": 1},{"fruit1": 2,"fruit2": 1,"fruit3": 1}];
      
      var { average } = myData.reduce((all, item) => {
      
          Object.keys(item).forEach(k => {
              all.count++;
              all.sum += item[k];
              all.average = all.sum / all.count;
          });
      
          return all;
      
      }, {average: 0, count: 0, sum: 0});
      
      console.log(average);
      

      或者在得到项目总数和总和后进行average 计算:

      var myData = [{"fruit1": 2,"fruit2": 2,"fruit3": 1},{"fruit1": 2,"fruit2": 1,"fruit3": 1}];
      
      var { count, sum } = myData.reduce((all, item) => {
      
          Object.keys(item).forEach(k => {
              all.count++;
              all.sum += item[k];
          });
      
          return all;
      
      }, {count: 0, sum: 0});
      
      var average = sum / count;
      
      console.log(average);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-25
        • 2018-04-25
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多