【问题标题】:Nested for loop and alternate map method嵌套 for 循环和备用 map 方法
【发布时间】:2016-10-06 03:05:41
【问题描述】:

我是 javascript 的初学者,如果这个问题太简单,请多多包涵。我正在尝试简化此功能

var calculateTotal =function(nodeData){

    var totalSelectedUnit0 = 0;
    var totalSelectedUnit1 = 0;
    var totalSelectedUnit2 = 0;

    for(x=$scope.selectFrom; x<$scope.selectTo; x++){
        totalSelectedUnit0 += nodeData.items[0].usage.categories[x].current;
        totalSelectedUnit1 += nodeData.items[1].usage.categories[x].current;
        totalSelectedUnit2 += nodeData.items[2].usage.categories[x].current;
    }
    console.log(totalSelectedUnit0);
    console.log(totalSelectedUnit1);
    console.log(totalSelectedUnit2);

};

calculateTotal(node);

这就是我尝试重构代码的方式

var calculateTotal =function(nodeData){
    var totalSelectedUnit=[];
    for(i=0; i<nodeData.items.length; i++){
        for(x=$scope.selectFrom; x<$scope.selectTo; x++){
            totalSelectedUnit[i] += nodeData.items[i].usage.categories[x].current;
        }
    }
    console.log(totalSelectedUnit);
};

我想在这里实现几件事。计算应忽略 nullNan 值。另外我想使用mapreduce 来实现这个计算。

【问题讨论】:

  • 您的功能乍一看似乎没问题。它是否按预期工作?什么 console.log(totalSelectedUnit);给?在特定情况下是否有错误?
  • 如果你想忽略x += y 中的nullNaN 值,你可以说x += y || 0(注意JavaScript's logical operators 的工作方式与大多数其他语言不同)。在内部 for 循环之前,您还需要 totalSelectedUnit[i] = 0。我认为.map() 在这里没有多大意义。
  • 关于您的错误,是否所有 nodeData.items 数组条目都有 usage 属性?
  • 抱歉,代码出现了小错误。现在它输出的是-,只是一个连字符,假设我们有些项目没有使用属性,我们如何跳过这些并计算剩余?
  • for 语句中声明变量时要非常小心。例如:for(i=0;... 在名为i 的窗口对象上创建一个全局变量。这会在未来给你带来痛苦。声明变量时始终使用 var 关键字。

标签: javascript arrays object ecmascript-6


【解决方案1】:

我看到的第一个问题是结果数组没有初始化,所以结果将是NaN,因为您将undefined 值添加到一个数字。

var calculateTotal = function(nodeData) {
  var totalSelectedUnit = nodeData.items.map(function(item) { //create a result value for each item in the items array
    return item.usage.categories.slice($scope.selectFrom, $scope.selectTo).reduce(function(v1, v2) { //sum up values between the from and to index
      return v1 + (v2 || 0); //ignore the falsy values
    }, 0);
  })

  console.log(totalSelectedUnit);
};

var $scope = {
  selectFrom: 0,
  selectTo: 4
};

var nodeData = {
  items: [{
    usage: {
      categories: [2, 3, 4, 5, 6, 7, 8, 9, 1]
    }
  }, {
    usage: {
      categories: [12, 13, 14, 15, 16, 17, 18, 19, 10]
    }
  }, {
    usage: {
      categories: [22, 23, 24, 25, 26, 27, 28, 29, 20]
    }
  }]
};

calculateTotal(nodeData);

【讨论】:

  • 代码看起来不错,但是您错过了current 部分吗? categories[x].current
  • @anoopchandran 你可以补充一下,用这种结构创建一个虚拟数据有点困难,这就是我省略的原因
  • 你是对的,我通过初始化我的结果数组来解决这个问题。 var totalSelectedUnit=[]; for(i=0; i&lt;nodeData.items.length; i++){ totalSelectedUnit[i] = 0; }
猜你喜欢
  • 2021-03-02
  • 2019-02-18
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多