在javascript中找到具有常用键的散列数组的最高值
问题描述:
我目前有一个带有散列数组的JSON文件,并希望能够为包含最高级别的每个匹配键“Club”返回一个散列数组“十进制”值(在我的Angular应用程序中使用JavaScript)。在javascript中找到具有常用键的散列数组的最高值
[
{"Bookmaker": "First", "Club": "Man City", "Decimal": 3.65},
{"Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5},
{"Bookmaker": "First", "Club": "Chelsea", "Decimal": 6.8}
{"Bookmaker": "Second", "Club": "Man City", "Decimal": 3.5},
{"Bookmaker": "Second", "Club": "Man Utd", "Decimal": 4},
{"Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7}
]
在这个例子中,返回的数组将像这样:
[
{"Bookmaker": "First", "Club": "Man City", "Decimal": 3.65},
{"Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5},
{"Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7}
]
返回散列与对每个“俱乐部”最高“十进制”值。
答
var list = [
{"Bookmaker": "First", "Club": "Man City", "Decimal": 3.65},
{"Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5},
{"Bookmaker": "First", "Club": "Chelsea", "Decimal": 6.8},
{"Bookmaker": "Second", "Club": "Man City", "Decimal": 3.5},
{"Bookmaker": "Second", "Club": "Man Utd", "Decimal": 4},
{"Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7}
];
var filtered = list.reduce(function(p, v){
if(!p[v.Club]){
p[v.Club] = v;
} else {
if (p[v.Club].Decimal < v.Decimal) {
p[v.Club] = v;
}
}
return p;
}, {});
//as list
filtered = Object.keys(filtered).map(function (key) {return filtered[key]});
console.log(filtered);
这应该工作。
答
如果在结果集中找到一个剔除器值,可以使用一个散列表并更改结果。
var data = [{ "Bookmaker": "First", "Club": "Man City", "Decimal": 3.65 }, { "Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5 }, { "Bookmaker": "First", "Club": "Chelsea", "Decimal": 6.8 }, { "Bookmaker": "Second", "Club": "Man City", "Decimal": 3.5 }, { "Bookmaker": "Second", "Club": "Man Utd", "Decimal": 4 }, { "Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7 }],
result = [];
data.forEach(function (a) {
if (a.Club in this) {
if (result[this[a.Club]].Decimal < a.Decimal) {
result[this[a.Club]] = a;
}
return;
}
this[a.Club] = result.push(a) - 1;
}, Object.create(null));
console.log(result);
答
如果你有机会获得像underscore库可以简化问题的几个链式调用。
var list = [
{"Bookmaker": "First", "Club": "Man City", "Decimal": 3.65},
{"Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5},
{"Bookmaker": "First", "Club": "Chelsea", "Decimal": 6.8},
{"Bookmaker": "Second", "Club": "Man City", "Decimal": 3.5},
{"Bookmaker": "Second", "Club": "Man Utd", "Decimal": 4},
{"Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7}
];
var maxes = [];
_.chain(list)
.groupBy(function(obj) { return obj.Club; })
.each(function(groupedList) {
maxes.push(_.max(groupedList, function(item) {
return item.Decimal;
}));
});
// maxes array will now have the three objects with the highest Decimal