使用 javascript 简化对象计算
Simplify object calculations using javascript
我已经将我的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
相关文章:
- 如何计算对象文字中的键
- 使用jQuery计算数组中的对象以更改进度条
- 插件SDK中的动态或计算对象创建
- 计算从一个对象到另一个对象的路径并沿其移动
- 根据摄影机视图更改计算对象旋转
- 如何计算一个对象中五个属性中有多少是非null的
- 如何使用Knockout Mapping插件映射到来自服务器对象的数组,并进行一些计算
- 如何递归地计算它在对象中出现的目标键(属性)的数量
- 为对象计算的聚合物
- 使用 javascript 简化对象计算
- TypeError: undefined 不是对象(计算 'type.toString')
- 从日期对象计算 BST 时间
- 基于父集合中的子对象计算的属性
- 函数从子对象计算父对象大小's大小
- 使用Date对象计算Javascript执行速度是否正确
- 抛出TypeError错误:null不是一个对象(计算"$("body").append&
- TypeError: null不是对象(计算'document.getElementById(x).style&
- 什么Javascript库可以针对对象计算类似mongodb的查询谓词
- & # 39;未定义# 39;在Safari中不是对象(计算'window.webkitURL.createOb
- 如何修复:TypeError: 'null'不是一个对象(计算'event.relatedTar