2016-07-28 3 views
1

Ich habe derzeit eine JSON-Datei mit einem Array von Hashes und möchte in der Lage sein, ein Array von Hashes für jeden passenden Schlüssel "Club", der die höchste enthält "Decimal" -Wert (mit Javascript in meiner Angular App).finden die höchsten Werte für ein Array von Hashes mit gemeinsamen Schlüsseln in Javascript

[ 
{"Bookmaker": "First", "Club": "Man City", "Decimal": 3.65}, 
{"Bookmaker": "First", "Club": "Man Utd", "Decimal": 4.5}, 
{"Bookmaker": "Second", "Club": "Chelsea", "Decimal": 7} 
] 

Rückgabe des Hashes mit dem höchsten "Dezimal" Wert für jeden "Club":

[ 
    {"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} 
    ] 

In diesem Beispiel wird das zurückgegebene Array wie so sein würde.

Antwort

1

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

Das sollte funktionieren.

1

Sie können eine Hash-Tabelle verwenden und das Ergebnis ändern, wenn in der Ergebnismenge ein Reibewert gefunden wird.

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

0

Wenn Sie Zugriff auf eine Bibliothek wie underscore haben Sie das Problem auf wenige gekettet Anrufe vereinfachen kann.

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