2016-07-29 12 views
1

Ich habe zwei Arrays von Objekten:Machen ein zu viele Beziehung Array in JavaScript

var a = [{ 
    "id": 1, 
    "name": "q" 
}, 
{ 
    "id": 2, 
    "name": "l" 
}] 

und eine andere

var b = [{ 
    "id": 3, 
    "sub": 1, 
    "name": "ni" 
}, 
{ 
    "id": 4, 
    "sub": 2, 
    "name": "bh" 
}] 

Hier Unter ist die ID in a

Ich muss haben ein neues Array, das wie folgt aussehen wird:

var c = [ 
    { 
    "id":1, 
    "name":"q", 
    "map":[ 
     { 
     "id":3, 
     "name":"ni" 
     } 
    ] 
    }, 
    { 
    "id":2, 
    "name":"l", 
    "map":[ 
     { 
     "id":4, 
     "name":"bh" 
     } 
    ] 
    } 
] 

Wie kann ich das in JavaScript machen?

Ich verwende Unterstriche in meinem Projekt.

Antwort

4

Im Klar Javascript könnten Sie Array#map, Array#forEach und eine Hash-Tabelle verwenden.

var a = [{ "id": 1, "name": "q" }, { "id": 2, "name": "l" }], 
 
    b = [{ "id": 3, "sub": 1, "name": "ni" }, { "id": 4, "sub": 2, "name": "bh" }], 
 
    hash = Object.create(null), 
 
    result = a.map(function (a, i) { 
 
     hash[a.id] = { id: a.id, name: a.name }; 
 
     return hash[a.id]; 
 
    }, hash); 
 

 
b.forEach(function (a) { 
 
    hash[a.sub].map = hash[a.sub].map || []; 
 
    hash[a.sub].map.push({ id: a.id, name: a.name }); 
 
}, hash); 
 

 
console.log(result);

ES6

var a = [{ "id": 1, "name": "q" }, { "id": 2, "name": "l" }], 
 
    b = [{ "id": 3, "sub": 1, "name": "ni" }, { "id": 4, "sub": 2, "name": "bh" }], 
 
    hash = Object.create(null), 
 
    result = a.map((hash => a => hash[a.id] = { id: a.id, name: a.name, map: [] })(hash)); 
 

 
b.forEach((hash => a => hash[a.sub].map.push({ id: a.id, name: a.name }))(hash)); 
 

 
console.log(result);

+0

In dem ES6-Code heißt es: Arrow-Funktion sollte keine Zuweisung in dieser Zeile zurückgeben. Result = a.map ((hash => a => hash [a.id] = {id: a.id, name: a .name, map: []}) (hash)); ' – nirvair

+0

Welchen Browser benutzen Sie? –

+0

Ich mache das in Node.js – nirvair

1

Sie können es mit Hilfe der map Funktion tun und dann die find Funktion verwenden, um die Daten aus dem anderen Array zu suchen.

var b = [{ 
 
    "id": 3, 
 
    "sub": 1, 
 
    "name": "ni" 
 
}, { 
 
    "id": 4, 
 
    "sub": 2, 
 
    "name": "bh" 
 
}]; 
 
var a = [{ 
 
    "id": 1, 
 
    "name": "q" 
 
}, { 
 
    "id": 2, 
 
    "name": "l" 
 
}]; 
 

 
var final = _.map(b, function(d) { 
 
    return { 
 
     id: d.name, 
 
     name: d.name, 
 
     map: _.find(a, function(adata) { 
 
      return adata.id == d.sub; //use underscore find to get the relevant data from array a 
 
     }) 
 
    } 
 
}); 
 

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

+0

Der Schlüssel 'map' innen' final' kein Array von Objekten. Ich brauche ein Array. – nirvair