Comment puis-je obtenir la totalité du véhicule dans les données ci-dessous avec les valeurs les plus élevées?

J'ai un objet JSON qui ressemble à ceci:

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
}];

Dans le JSON object ci-dessus, pour chaque marque de véhicule, je dois obtenir la version la plus élevée.

Le résultat sera donc toutes les valeurs de la version 6 pour Toyota et de la version 2 pour Honda.

Résultat:

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

Jusqu'à présent, je ne peux obtenir que la valeur la plus élevée, mais pas plusieurs véhicules:

Par exemple: cela me donnera la version 8 mais pas 8 et 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);

});

Une version similaire à cette question a été répondue, mais je ne peux pas trouver de solution à mon scénario particulier pour obtenir plusieurs ensembles de données. Obtention de la ou des valeurs maximales dans le tableau JSON.

2
Asynchronous 10 mars 2016 à 10:39

3 réponses

Meilleure réponse

Il s'agit d'une solution avec un objet et un {{ Boucle X0}}.

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>');
2
Nina Scholz 10 mars 2016 à 12:58

Essayez ceci. Trouvez d'abord tous les véhicules uniques dans les données. puis recherchez les données de chaque véhicule et comparez les versions.

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
Pavan Teja 10 mars 2016 à 07:51

Cela a été une fonction assez courante pour moi depuis un certain temps maintenant et s'applique bien à ce problème.

Il fait simplement une boucle sur le tableau d'origine, crée un objet en constante évolution, puis pousse les résultats dans un tableau.

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>
0
8eecf0d2 10 mars 2016 à 07:51