使用 javascript 简化对象计算

Simplify object calculations using javascript

本文关键字:对象 计算 javascript 使用      更新时间:2023-09-26

我已经将我的JSON对象保存在一个变量中,并且我正在根据对象中的属性进行计算;但是,我发现计算很长,如果数据变大,计算可能会变得很长。

我希望有一种比我目前更简单的计算方法。

以下是保存在 JavaScript 文件中的 JSON 数据:

var obj = {
  "Open": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":6,
    "Sprint_6":38,
    "Sprint_7":7
  }],
  "Design": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":null,
    "Sprint_6":1,
    "Sprint_7":null
  }],
  "Requirement": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":1,
    "Sprint_6":1,
    "Sprint_7":null
  }],
  "Ready_for_Build": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":4,
    "Sprint_6":2,
    "Sprint_7":null
  }],
  "Build": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":12,
    "Sprint_6":1,
    "Sprint_7":null
  }],
  "Ready_for_Test": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":4,
    "Sprint_6":4,
    "Sprint_7":null
  }],
  "Test": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":5,
    "Sprint_6":6,
    "Sprint_7":null
  }],
  "Ready_for_Acceptance": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":null,
    "Sprint_5":3,
    "Sprint_6":null,
    "Sprint_7":null
  }],
  "Accepted": [{
    "Sprint_2":38,
    "Sprint_3":43,
    "Sprint_4":57,
    "Sprint_5":19,
    "Sprint_6":null,
    "Sprint_7":null
  }],
  "Total_Bugs": [{
    "Sprint_2":47,
    "Sprint_3":39,
    "Sprint_4":71,
    "Sprint_5":39,
    "Sprint_6":null,
    "Sprint_7":null
  }],
  "Bugs_Success": [{
    "Sprint_2":37,
    "Sprint_3":25,
    "Sprint_4":42,
    "Sprint_5":11,
    "Sprint_6":null,
    "Sprint_7":null
  }],
  "Bugs_In_Progress": [{
    "Sprint_2":null,
    "Sprint_3":null,
    "Sprint_4":7,
    "Sprint_5":4,
    "Sprint_6":null,
    "Sprint_7":null
  }]
};

这是我用来对各种键中的数字求和的计算:

var totDone = obj.Ready_for_Test[0].Sprint_2 + obj.Ready_for_Test[0].Sprint_3 + obj.Ready_for_Test[0].Sprint_4 + obj.Ready_for_Test[0].Sprint_5 + obj.Ready_for_Test[0].Sprint_6 + obj.Ready_for_Test[0].Sprint_7 +
    obj.Test[0].Sprint_2 + obj.Test[0].Sprint_3 + obj.Test[0].Sprint_4 + obj.Test[0].Sprint_5 + obj.Test[0].Sprint_6 + obj.Test[0].Sprint_7 +
    obj.Ready_for_Acceptance[0].Sprint_2 + obj.Ready_for_Acceptance[0].Sprint_3 + obj.Ready_for_Acceptance[0].Sprint_4 + obj.Ready_for_Acceptance[0].Sprint_5 + obj.Ready_for_Acceptance[0].Sprint_6 + obj.Ready_for_Acceptance[0].Sprint_7 +
    obj.Accepted[0].Sprint_2 + obj.Accepted[0].Sprint_3 + obj.Accepted[0].Sprint_4 + obj.Accepted[0].Sprint_5 + obj.Accepted[0].Sprint_6 + obj.Accepted[0].Sprint_7;
    console.log(totDone); 

如果我的JSON数据扩展,为了进行进一步的计算,我的算法将变得非常冗长。有没有更简单的方法来对数据运行计算?

你可以这样称呼getSum

var answer = getSum(obj, 'Test');
console.log(answer);
function getSum(data, key){
    var sprints = data[key][0];
    var sum = 0;
    for (var sprint in sprints){
         if(sprints[sprint]){
              sum += sprints[sprint];
         }
    }
    return sum;
}

并得到所有总数

 var total = 0;
 for (var key in obj){
      total += getSum(onj, key);
 }
console.log(total);

如果你只想添加一些特定的冲刺值,那么你需要传递一个这些冲刺名称的列表,比如

function getSum(data, key, sprintNames){
    var sprints = data[key][0];
    var sum = 0;
    sprintNames.forEach(function(name){
        if(sprints[name]){
              sum += sprints[name]
         }
    });
    return sum;
}
getSum(obj, 'Design', ['Sprint_2', 'Sprint_3']);

假设您只想汇总该 JSON 中的所有非空值,这里有一个简单的 for 循环解决方案: https://jsfiddle.net/vgpw4h1h/1/

var sum = 0;
for (status in obj) {
  for (project in obj[status]) {
    for (sprint in obj[status][project]) {
      sum += obj[status][project][sprint];
    }
  }
}
console.log('Points from all sprints: ' + sum);

首先,数据结构很重要。结合评论部分的所有建议和我自己的经验,我建议将数据结构化如下。

// Your JavaScript Object
var backlog = {
    Open: [
        null, null, null,
        6, 38, 7
    ],
    Design: [
        null, null, null,
        null, 1, null
    ],
    Requirement: [
        null, null, null,
        1, 1, null
    ],
    Ready_for_Build: [
        null, null, null,
        4, 2, null
    ],
    Build: [
        null, null, null,
        12, 1, null
    ],
    Ready_for_Test: [
        null, null, null,
        4, 4, null
    ],
    Test: [
        null, null, null,
        5, 6, null
    ],
    Ready_for_Acceptance: [
        null, null, null,
        3, null, null
    ],
    Accepted: [
        38, 43, 57,
        19, null, null
    ],
    Total_Bugs: [
        47, 39, 71,
        39, null, null
    ],
    Bugs_Success: [
        37, 25, 42,
        11, null, null
    ],
    Bugs_In_Progress: [
        null, null, 7,
        4, null, null
    ]
};

首先注意所需的语法字符({、}、[、]、:、' 和 ")要少得多。这不一定是代码质量的指标,但在这种情况下,它也大大简化了下一组代码。

要获得总和,您可以使用 Array.prototype.reduce()Array.prototype.map() 等函数来迭代数据并以最少的重复执行强大的计算。

// A collection of the stages that you want to add up
var postDevBacklogStages = [
    backlog.Ready_for_Test,
    backlog.Test,
    backlog.Ready_for_Acceptance,
    backlog.Accepted
];
// A helper funnction to find the sum of an array
var sumArray = function (array){
    return array.reduce(function(previousValue, currentValue, currentIndex, array){
    if (typeof(currentValue) != "number") {
        return previousValue;
    } else {
      return previousValue + currentValue;
    }
  });
};
// Finds the sums of the arrays for each stage you want to add up
var postDevBacklogStageSums = postDevBacklogStages.map(function(currentValue, index, array){
    return sumArray(currentValue);
});
// Finds the sum of the sums of stages
var sumTotal = sumArray(postDevBacklogStageSums);
console.log(postDevBacklogStageSums); // [8, 11, 3, 157]
console.log(sumTotal); // 179