如何总结这些Javascript值?

时间:2017-09-22 11:38:20

标签: javascript jquery json object

我有以下对象数组。每个对象都有一对对象,供两个人使用。它持有分数,例如鲍勃的比赛1有10分,然后是第2场比赛,9分等等。

var arr = [{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
},

{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
},
{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
}
]

如何遍历每对物体(bob& max)并创建所有物体的平均值?我觉得循环中的循环真的让人困惑......我在努力学习如何写这个问题。

最终目标是拥有一对对象,其值将从数组中的所有先前对象中取平均值。 E.G对于每个人,我需要将每个人的成绩加分(得分1 - 12),然后创建最终的平均得分。我希望这是有道理的?就我所尝试的而言,我试图操纵很多其他的SO答案以满足我的需求,但是我在错误后一直遇到错误,因此不值得发布...

 // Final averaged scores for each person based on the total data available
[{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
}]

5 个答案:

答案 0 :(得分:1)

您可以采用单循环方法来计算所需的avarage。该提案以ES5为特色。

变量:

  • r:临时结果Array#reduce
  • o:object,数组的一个项目,
  • a:对他调用数组的引用,需要长度,
  • kl:嵌套对象的键。

模式:

var array = [{ bob: { 1: "10", 2: "9", 3: "9", 4: "10", 5: "9", 6: "7", 7: "10", 8: "10", 9: "10", 10: "9", 11: "10", 12: "8" }, max: { 1: "9", 2: "10", 3: "10", 4: "8", 5: "10", 6: "10", 7: "8", 8: "9", 9: "9", 10: "10", 11: "9", 12: "10" } }, { bob: { 1: "10", 2: "9", 3: "9", 4: "10", 5: "9", 6: "7", 7: "10", 8: "10", 9: "10", 10: "9", 11: "10", 12: "8" }, max: { 1: "9", 2: "10", 3: "10", 4: "8", 5: "10", 6: "10", 7: "8", 8: "9", 9: "9", 10: "10", 11: "9", 12: "10" } }, { bob: { 1: "10", 2: "9", 3: "9", 4: "10", 5: "9", 6: "7", 7: "10", 8: "10", 9: "10", 10: "9", 11: "10", 12: "8" }, max: { 1: "9", 2: "10", 3: "10", 4: "8", 5: "10", 6: "10", 7: "8", 8: "9", 9: "9", 10: "10", 11: "9", 12: "10" } }],
    result = array.reduce(function (r, o, _, a) {
        Object.keys(o).forEach(function (k) {
            r[k] = r[k] || {};
            Object.keys(o[k]).forEach(function (l) {
                r[k][l] = (r[k][l] || 0) + o[k][l] / a.length;
            });
        });
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

arr.reduce(function(res, obj, index, array) {
    Object.keys(obj).forEach(function(player) {
        res[player] = res[player] || {};
        Object.keys(obj[player]).forEach(function(game) {
            res[player][game] = res[player][game] || 0;
            res[player][game] += parseFloat(obj[player][game] / array.length);
        });
    });
    return res;
}, {});

答案 2 :(得分:0)

您可以使用array.maparray.reduce的组合来返回分数的总和。



console.clear();

var games = [
  {
    "bob": { "1": "10", "2": "9", "3": "9", "4": "10" },
    "max": { "1": "9", "2": "10", "3": "10", "4": "8" }
  },
  {
    "bob": { "1": "10", "2": "9", "3": "9", "4": "10" },
    "max": { "1": "9", "2": "10", "3": "10", "4": "8" }
  },
  {
    "bob": { "1": "10", "2": "9", "3": "9", "4": "10" },
    "max": { "1": "9", "2": "10", "3": "10", "4": "8" }
  }
];

let scores = {};
games.forEach( game => {
  Object.keys(game).forEach( player => {
    scores[player] = scores[player] || {};
    Object.keys(game[player]).forEach(gameNumber => {
      scores[player][gameNumber] = scores[player][gameNumber] || [];
      scores[player][gameNumber].push(parseInt(game[player][gameNumber]));
    });
  });
});

Object.keys(scores).forEach( player => {
  Object.keys(scores[player]).forEach(game => {
    let total = scores[player][game].reduce((a, b) => { return a+b; });
    let length = scores[player][game].length;
    
    scores[player][game] = total / length;
  });
});

console.info( scores );




答案 3 :(得分:0)

我使用了基本循环:

var gameCount = arr.length;

var outPutArr = {"bob":{},"max":{}};

// Initialize the output array
for(var i=1;i<=Object.keys(arr[0].bob).length;i++)
{
    outPutArr["bob"][i+""] = "0";
    outPutArr["max"][i+""] = "0";
}

// Loop through all games and add score of bob and max
arr.forEach(function(item){
    for(var i=1;i<=Object.keys(arr[0].bob).length;i++)
    {
        outPutArr["bob"][i+""] = (parseInt(item["bob"][i+""]) + parseInt(outPutArr["bob"][i+""]))+"";
        outPutArr["max"][i+""] = (parseInt(item["max"][i+""]) + parseInt(outPutArr["max"][i+""]))+"";
    }
});

for(var i=1;i<=Object.keys(arr[0].bob).length;i++)
{
    outPutArr["bob"][i+""] = (parseInt(outPutArr["bob"] [i+""])/gameCount)+"";
    outPutArr["max"][i+""] = (parseInt(outPutArr["max"] [i+""])/gameCount)+"";
}

console.log(JSON.stringify(outPutArr));

答案 4 :(得分:0)

这会是你想要的吗? 它总结了用户你有多少游戏得分(只要它不是每个对象100+)并将结果存储在summs对象

您可以通过此fiddle

在控制台中观察结果
var arr = [{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
},

{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
},
{
  "bob": {
    "1": "10",
    "2": "9",
    "3": "9",
    "4": "10",
    "5": "9",
    "6": "7",
    "7": "10",
    "8": "10",
    "9": "10",
    "10": "9",
    "11": "10",
    "12": "8"
  },
  "max": {
    "1": "9",
    "2": "10",
    "3": "10",
    "4": "8",
    "5": "10",
    "6": "10",
    "7": "8",
    "8": "9",
    "9": "9",
    "10": "10",
    "11": "9",
    "12": "10"
  }
}
]

var summs = {};

arr.forEach(function(users, ind, arr){
    for (var user in users) {
    if (users.hasOwnProperty(user)) {
      if (!summs.hasOwnProperty(user)) summs[user] = 0;
      console.log(users[user]);
        for (var i = 0; i < 100; i++){
            if (users[user].hasOwnProperty(i+'')){
                summs[user] += parseInt(users[user][i]);
            }
      }
    }
  } 
});
console.log(summs);