2017-06-05 2 views
-1

ich diesen Satz von Daten, die ich habe keine Kontrolle (es API irgendwo gehostet wird, habe ich keinen Zugriff)Pull Eigenschaft Objekt als übergeordnetes Objekt

let x = [ 
    {name: "james", age: 10, school: {id:1, name:"London"}}, 
    {name: "james_2", age: 11, school: {id:1, name:"London"}}, 
    {name: "john", age: 12, school: {id:2, name:"India"}}, 
    {name: "johnny", age: 56, school: {id:3, name:"USA"}} 
] 

Wie kann ich Gruppe Schule zuerst? Ich brauche das Format wie dieses

[{ 
    id:1, 
    name: "London", 
    data: [{ 
     name: "james", age: 10, school: {id:1, name:"London" 
    },{name: "james_2", age: 11, school: {id:1, name:"London"}}] 
}] 

Antwort

2

Sie _.groupBy() verwenden können und die Ergebnisse zurück in eine Array-Karte:

const data = [{"name":"james","age":10,"school":{"id":1,"name":"London"}},{"name":"james_2","age":11,"school":{"id":1,"name":"London"}},{"name":"john","age":12,"school":{"id":2,"name":"India"}},{"name":"johnny","age":56,"school":{"id":3,"name":"USA"}}]; 
 

 
const result = _(data) 
 
    .groupBy('school.name') 
 
    .map((group) => ({ // or Object.assign({}, group[0].school, { data: group }); 
 
    ...group[0].school, 
 
    data: group 
 
    })) 
 
    .value(); 
 

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

Sie können mit Map unter Verwendung Array#reduce in Kombination die gleichen Dinge ohne lodash tun:

const data = [{"name":"james","age":10,"school":{"id":1,"name":"London"}},{"name":"james_2","age":11,"school":{"id":1,"name":"London"}},{"name":"john","age":12,"school":{"id":2,"name":"India"}},{"name":"johnny","age":56,"school":{"id":3,"name":"USA"}}]; 
 

 
const result = [...data.reduce((map, item) => { 
 
    const school = map.get(item.school.name) || { // or Object.assign({}, { item.school }, { data: [] }) 
 
    ...item.school, data: [] 
 
    }; 
 
    
 
    school.data.push(item); 
 
    
 
    map.set(item.school.name, school); 
 
    
 
    return map; 
 
}, new Map()).values()] 
 

 
console.log(result);

+0

was ist Dies? _ (Daten) –

+0

Gruppe [0] .school Warum verwenden Sie [0] hier? –

+0

_ (Daten) startet eine lodash-Kette. Mit group [0] .school wird der Name und die ID der Schule aus dem ersten Element der Gruppe übernommen. –

0
sein

Sie einen Hash-Objekt erstellen können, die jede Schule in seiner ID speichert, so dass Sie die Schüler schieben:

var hash=x.reduce(function(obj,el){ 
(obj[el.school.id]=obj[el.school.id]||{id:el.school.id,name:el.school.name,data:[]}).data.push({name:el.name,age:el.age}); 
    return obj; 
},{}); 

var arr=Object.values(hash); 

http://jsbin.com/vedajijiye/edit?console

0

Sie können die reduce() Methode verwenden:

let data = [ 
 
    {name: "james", age: 10, school: {id:1, name:"London"}}, 
 
    {name: "james_2", age: 11, school: {id:1, name:"London"}}, 
 
    {name: "john", age: 12, school: {id:2, name:"India"}}, 
 
    {name: "johnny", age: 56, school: {id:3, name:"USA"}} 
 
]; 
 
let schools = data.reduce((acc, x) => { 
 
    // Check if the school already exists 
 
    let school = acc.find(y => y.id === x.school.id); 
 
    if (!school) { 
 
    // If not, the current school is the school of the current person 
 
    school = x.school; 
 
    school.data = []; 
 
    acc.push(school); 
 
    } else { 
 
    // Prevent duplication of school objects with the same id 
 
    x.school = school; 
 
    } 
 
    school.data.push(x); 
 
    return acc; 
 
}, []); 
 
console.log(schools);

0

können Sie lodash Bibliothek mit groupBy

let x = [ 
    {name: "james", age: 10, school: {id:1, name:"London"}}, 
    {name: "james_2", age: 11, school: {id:1, name:"London"}}, 
    {name: "john", age: 12, school: {id:2, name:"India"}}, 
    {name: "johnny", age: 56, school: {id:3, name:"USA"}} 
] 


var result2 = _.chain(x) 
    .groupBy(function(o){return o.school.name}) 
    .pairs() 
    .map(function (currentItem) { 
     return _.object(_.zip(["school", "name"], currentItem)); 
    }) 
    .value(); 
console.log(result2); 

mehr anzeigen, jsFiddle verwenden: - http://jsfiddle.net/6yasy30a/

+0

Paare? Wofür ist das? –

+0

@AlanJenshen _pairs(): - Erstellt ein zweidimensionales Array der Schlüssel/Wert-Paare für ein Objekt, z. [[Schlüssel1, Wert1], [Schlüssel2, Wert2]]. _.pairs ({'barney': 36, 'fred': 40}); // => [['barney', 36], ['fred', 40]] (Iterationsreihenfolge ist nicht garantiert) –

+0

Ihre Logik ist komplizierter als Ori's Code –

0

let x = [ 
 
    {name: "james", age: 10, school: {id:1, name:"London"}}, 
 
    {name: "james_2", age: 11, school: {id:1, name:"London"}}, 
 
    {name: "john", age: 12, school: {id:2, name:"India"}}, 
 
    {name: "johnny", age: 56, school: {id:3, name:"USA"}} 
 
]; 
 

 
let result = []; 
 
for(var i = 0; i < x.length; i++) { 
 
    var person = x[i]; 
 
    var school = result.find(s => s.id === person.school.id); 
 
    if(!school) { 
 
    school = { 
 
     id: person.school.id, 
 
     name: person.school.name, 
 
     data: [] 
 
    }; 
 
    result.push(school); 
 
    } 
 
    school.data.push(person); 
 
} 
 

 
console.log(result);

0

Nutzung reduzieren und einfach ein neues Objekt drücken in das resultierende Array, wenn die ID nicht existiert, sonst aktualisiere einfach t Das Datenfeld im gefundenen Objekt

const myArray = x.reduce((res, data) => { 
    const found = res.find(o => o.id === data.school.id); 

    if (!found) { 
    res.push({ 
     id: data.school.id, 
     name: data.school.name, 
     data: [data] 
    }); 
    } else { 
    found.data.push(data); 
    } 
    return res; 
}, []); 


console.log(myArray) 
Verwandte Themen