2017-10-03 3 views
-3

kennt jemand eine effizientesten layesh oder underscore.js Weg ein Array von Objekten durch einen Objektschlüssel gruppieren dann ein neues Array von Objekten auf der Grundlage der Gruppierung erstellen? Zum Beispiel habe ich eine Reihe von Auto-Objekte:Wie effizient zu rekonstruieren und gruppieren ein Array mit Schlüssel

var cars = [ 

     { 
      'make': 'audi', 
      'model: 'r8', 
      'year': '2012' 
     }, 
     { 
      'make': 'audi', 
      'model: 'rs5', 
      'year': '2013' 
     }, 
     { 
      'make': 'ford', 
      'model: 'mustang', 
      'year': '2012' 
     }, 
     { 
      'make': 'ford', 
      'model: 'fusion', 
      'year': '2015' 
     }, 
     { 
      'make': 'kia', 
      'model: 'optima', 
      'year': '2012' 
     }, 

    ]; 

Ich möchte eine neue Reihe von Auto-Objekte machen, die von keys gruppiert sind:

var cars = 
[{ 
     "title": "make", 
     "data": [{ 
       "value": "audi" 
      }, 
      { 
       "value": "ford" 
      }, 
      { 
       "value": "kia" 
      } 
     ] 
    }, 
    { 
     "title": "model", 
     "data": [{ 
       "value": "r8" 
      }, 
      { 
       "value": "rs5" 
      }, 
      { 
       "value": "mustang" 
      }, 
      { 
       "value": "fusion" 
      }, 
      { 
       "value": "optima" 
      } 
     ] 
    }, 
    { 
     "title": "year", 
     "data": [{ 
       "value": "2012" 
      }, 
      { 
       "value": "2013" 
      }, 
      { 
       "value": "2015" 
      } 
     ] 
    } 
] 

Vielen Dank im Voraus!

+1

Vorzuschlagen ** effizienteste ** Art und Weise, bräuchten wir Ihre Bemühungen zu sehen, und vergleichen/verbessern es, wenn es irgendeinen Umfang ist. Also teile bitte deinen Code. – Rajesh

+3

Ich stimme ab, diese Frage als Off-Topic zu schließen, weil die Frage kein Zeichen von Anstrengung zeigt. Es zeigt nur Eingabedaten und erwartete Ausgabe an. Dies ist eine Anforderung und keine Problemaussage. – Rajesh

Antwort

1

Vielleicht nicht sehr effizient, aber lesbar und einfacher Ansatz (ohne lodash noch Strich):

var cars = [ 
 
    { 
 
     'make': 'audi', 
 
     'model': 'r8', 
 
     'year': '2012' 
 
    }, 
 
    { 
 
     'make': 'audi', 
 
     'model': 'rs5', 
 
     'year': '2013' 
 
    }, 
 
    { 
 
     'make': 'ford', 
 
     'model': 'mustang', 
 
     'year': '2012' 
 
    }, 
 
    { 
 
     'make': 'ford', 
 
     'model': 'fusion', 
 
     'year': '2015' 
 
    }, 
 
    { 
 
     'make': 'kia', 
 
     'model': 'optima', 
 
     'year': '2012' 
 
    }, 
 

 
]; 
 

 
var res = []; 
 
cars.forEach(car => { 
 
    var keys = Object.keys(car); 
 
    keys.forEach(key => { 
 
     var obj = res.find(o => o.title === key); 
 
     if (obj) { 
 
      if (!obj.data.some(it => it.value === car[key])) { \t \t \t 
 
       obj.data.push({ value: car[key]}); \t 
 
      } \t \t 
 
     } else { 
 
      res.push({title: key, data: []}); 
 
     } 
 
    }); 
 
}); 
 
console.log(res);

+0

Bitte OP Aufwand teilen lassen. Wir sollten solche Fragen nicht beantworten. Auch das Ausgabeformat von OP ist anders – Rajesh

1

Sie brauchen so etwas.

var cars =[ 
 
    { 
 
    'make': 'audi', 
 
    'model': 'r8', 
 
    'year': '2012' 
 
    }, 
 
    { 
 
    'make': 'audi', 
 
    'model': 'rs5', 
 
    'year': '2013' 
 
    }, 
 
    { 
 
    'make': 'ford', 
 
    'model': 'mustang', 
 
    'year': '2012' 
 
    } 
 
]; 
 
var result = _.map(cars, car => _. pairs(car)) 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Dann Gruppe die Arrays, wie Sie wollen.

+0

Bitte teilen Sie OP Aufwand. Wir sollten solche Fragen nicht beantworten. Auch das Ausgabeformat von OP ist anders – Rajesh

1

Keine Notwendigkeit für lodash oder unterstreichen. Überprüfen Sie diese Implementierung, die ich gemacht habe.

function GroupArray(array) { 
    let result = {}; 
    array.forEach(function(item) { 
    Object.keys(item).forEach(function(key) { 
     if (!result[key]) result[key] = []; 
     if (result[key].indexOf(item[key]) == -1) { 
     result[key].push(item[key]); 
     } 
    }); 
    }); 
    return result; 
} 

var cars = [ 
     { 
      'make': 'audi', 
      'model': 'hello', 
      'year': '2012' 
     }, 
     { 
      'make': 'audi', 
      'model': 'rs5', 
      'year': '2013' 
     }, 
     { 
      'make': 'ford', 
      'model': 'mustang', 
      'year': '2012' 
     }, 
     { 
      'make': 'ford', 
      'model': 'fusion', 
      'year': '2015' 
     }, 
     { 
      'make': 'kia', 
      'model': 'optima', 
      'year': '2012' 
     }, 

    ]; 

console.log(GroupArray(cars)); 
+0

Bitte OP teilen Aufwand. Wir sollten solche Fragen nicht beantworten. Auch das Ausgabeformat von OP ist anders – Rajesh

Verwandte Themen