在javascript中查找具有公共键的哈希数组的最高值

find highest values for an array of hashes with common keys in javascript

本文关键字:哈希 数组 最高值 javascript 查找      更新时间:2023-09-26

我目前有一个带有哈希数组的JSON文件,希望能够为每个匹配的键"Club"返回一个哈希数组,该键包含最高的"Decimal"值(在我的Angular应用程序中使用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}
]

为每个"Club"返回具有最高"Decimal"值的哈希。

如果在结果集中找到更大的值,则可以使用哈希表来更改结果。

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);

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 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