我有以下对象数组。每个对象都有一对对象,供两个人使用。它持有分数,例如鲍勃的比赛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"
}
}]
答案 0 :(得分:1)
您可以采用单循环方法来计算所需的avarage。该提案以ES5为特色。
变量:
r
:临时结果Array#reduce
,o
:object,数组的一个项目,a
:对他调用数组的引用,需要长度,k
,l
:嵌套对象的键。模式:
||
:logical OR作为默认运营商。
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.map
和array.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);