2016-03-10 40 views
2

如何獲得所有車輛在以下數據中的最高值?如何從JSON對象中檢索具有最高數值的多組數據?

我有一個JSON對象,看起來像這樣:

var data = [{ 
    "Make": "Honda", 
    "Model": "Civic", 
    "Year": "2005", 
    "Color": "Red", 
    "Status": "In-Production", 
    "Version": 1 
}, { 
    "Make": "Honda", 
    "Model": "Civic", 
    "Year": "2005", 
    "Color": "Red", 
    "Status": "Discontinued", 
    "Version": 2 
},{ 
    "Make": "Toyota", 
    "Model": "Camry", 
    "Year": "2016", 
    "Color": "Black", 
    "Status": "In-Production", 
    "Version": 5 
}, { 
    "Make": "Toyota", 
    "Model": "Camry", 
    "Year": "2016", 
    "Color": "Black", 
    "Status": "Discontinued", 
    "Version": 6 
}]; 

在上面JSON object,每輛車製作,我需要得到的最高版本。

因此,結果將是豐田版本6和本田版本2的所有值。

結果:

[{ 
     "Make": "Honda", 
     "Model": "Civic", 
     "Year": "2005", 
     "Color": "Red", 
     "Status": "Discontinued", 
     "Version": 2 
    },{ 
     "Make": "Toyota", 
     "Model": "Camry", 
     "Year": "2016", 
     "Color": "Black", 
     "Status": "Discontinued", 
     "Version": 6 
    }] 

到目前爲止,我只能夠得到的最高值,但並不多輛車:

例如:這會給我的第8版,但不是8和2

var query = data.filter(function(result){ 

    var maxVersion = []; 

    for (var j = 0; j < data.length; j++){ 
     maxVersion.push(data[j].Version); 
    } 

    return result.Version === Math.max.apply(null, maxVersion); 

}); 

這個問題的一個類似的版本已經回答了,但我不能拿出一個解決方案來獲得我的特定場景來獲得多組數據。 Getting max value(s) in JSON array

回答

2

這是與對象和Array#forEach()環中的溶液。

var data = [{ "Make": "Honda", "Model": "Civic", "Year": "2005", "Color": "Red", "Status": "In-Production", "Version": 1 }, { "Make": "Honda", "Model": "Civic", "Year": "2005", "Color": "Red", "Status": "Discontinued", "Version": 2 }, { "Make": "Toyota", "Model": "Camry", "Year": "2016", "Color": "Black", "Status": "In-Production", "Version": 5 }, { "Make": "Toyota", "Model": "Camry", "Year": "2016", "Color": "Black", "Status": "Discontinued", "Version": 6 }], 
 
    maxed = function (data) { 
 
     var r = [], o = {}; 
 
     data.forEach(function (a) { 
 
      if (!(a.Make in o)) { 
 
       o[a.Make] = r.push(a) - 1; 
 
       return; 
 
      } 
 
      if (a.Version > r[o[a.Make]].Version) { 
 
       r[o[a.Make]] = a; 
 
      } 
 
     }); 
 
     return r; 
 
    }(data); 
 

 
document.write('<pre>' + JSON.stringify(maxed, 0, 4) + '</pre>');

0

試試這個。首先找到數據中的所有獨特車輛。然後搜索每輛車的數據並比較各個版本。

var data = [{ 
 
    "Make": "Honda", 
 
    "Model": "Civic", 
 
    "Year": "2005", 
 
    "Color": "Red", 
 
    "Status": "In-Production", 
 
    "Version": 1 
 
}, { 
 
    "Make": "Honda", 
 
    "Model": "Civic", 
 
    "Year": "2005", 
 
    "Color": "Red", 
 
    "Status": "Discontinued", 
 
    "Version": 2 
 
}, { 
 
    "Make": "Toyota", 
 
    "Model": "Camry", 
 
    "Year": "2016", 
 
    "Color": "Black", 
 
    "Status": "In-Production", 
 
    "Version": 5 
 
}, { 
 
    "Make": "Toyota", 
 
    "Model": "Camry", 
 
    "Year": "2016", 
 
    "Color": "Black", 
 
    "Status": "Discontinued", 
 
    "Version": 6 
 
}]; 
 

 

 

 
var makes = []; 
 

 
for (i = 0; i < data.length; i++) { 
 
    if (makes.indexOf(data[i].Make) == -1) { 
 
    makes.push(data[i].Make) 
 
    } 
 
} 
 

 

 

 
var vehicle = makes.map(function(m) { 
 

 
    var res = data.filter(function(v) { 
 
    return v.Make == m 
 
    }); 
 

 
    var result = res.reduce(function(p, c) { 
 
    return p.Version > c.Version ? p : c; 
 
    }) 
 

 
    return result 
 
}) 
 

 
document.write('<pre>' + JSON.stringify(vehicle, 0, 4) + '</pre>')

+0

謝謝你這麼多大家! – Asynchronous

0

這一直是我的一個很常見的功能一段時間了,並適用於這個問題很好。

它只是遍歷原始數組,創建一個不斷髮展的對象,然後將結果推送到一個數組。

var arr = [ 
 
    { name: 'Tom', age: 12 }, 
 
    { name: 'John', age: 8 }, 
 
    { name: 'Tom', age: 2 }, 
 
    { name: 'Kelly', age: 6 }, 
 
    { name: 'Kelly', age: 10 } 
 
]; 
 

 
var obj = {}; 
 
var oldest = []; 
 

 
arr.forEach(function(entry, index){ 
 
    oldest = []; 
 
    if(obj[entry.name] && obj[entry.name].age < entry.age) { 
 
    obj[entry.name] = entry; 
 
    } else if(!obj[entry.name]) { 
 
    obj[entry.name] = entry; 
 
    } 
 
    for(key in obj){ 
 
    oldest.push(obj[key]) 
 
    } 
 
}) 
 
console.log(oldest)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

相關問題