2016-06-30 15 views
1

Ich habe ein Objekt (von MongoDB kommt), das wie folgt aussieht:Kann Schleife richtig durch in verschachteltem Objekt/Array in Javascript

var test = [ 
    { 
    "_id": "1", 
    "childs": [ 
     { 
     "name": "First child", 
     "child_id": 1 
     }, 
     { 
     "name": "Second child", 
     "child_id": 2 
     } 
    ] 
    }, 
    { 
    "_id": "2", 
    "childs": [ 
     { 
     "name": "First child", 
     "child_id": 1 
     } 
    ] 
    } 
]; 

Ich versuche, durch diese Schleife und jedes Kind zeigen, wie ein separater Artikel Dies ist, wie ich es so mache:

var response_items = []; 

//Process relays as individual devices 
test.forEach(function(device) { 
    var response_item = {}; 
    response_item._id = device._id; 

    //Process relays as individual devices 
    device.childs.forEach(function(child) { 
     response_item.name = child.name; 
     response_item.child_id = child.child_id; 
     //Return devices 
     response_items.push(response_item); 
    }); 
}); 

console.log(response_items); 

Aber aus irgendeinem Grund das ist das Ergebnis bekam ich:

Array (3) 
{_id: "1", name: "Second child", child_id: 2} 
{_id: "1", name: "Second child", child_id: 2} 
{_id: "2", name: "First child", child_id: 1} 

Der dritte Punkt ist richtig, aber die erste und die zweite dupliziert und ich habe keine Ahnung, was ich falsch mache.

Beispiel: https://jsfiddle.net/om89y661/

+2

Sicher, Sie mutieren das gleiche Objekt innerhalb der inneren 'forEach()', also überschreibt die nächste Iteration die vorherigen Eigenschaften, die Sie festgelegt haben. Sie schieben dann das gleiche Objekt in das Array. Deklarieren Sie stattdessen Ihr 'var response_item = {}' innerhalb des inneren '.forEach()'. JS kopiert niemals implizit Objekte. –

+1

Versuchen Sie, die ersten beiden Codezeilen (var response_item = {} ...) in 'device.childs.forEach()' zu setzen oder werfen Sie einen Blick auf diese Geige (gabeln Sie sie) https://jsfiddle.net/5kyk7pbx/ – Jorrex

+0

Ich fühle mich dumm ... Danke – passatgt

Antwort

0

var test = [ 
 
    { 
 
    "_id": "1", 
 
    "childs": [ 
 
     { 
 
     "name": "First child", 
 
     "child_id": 1 
 
     }, 
 
     { 
 
     "name": "Second child", 
 
     "child_id": 2 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "_id": "2", 
 
    "childs": [ 
 
     { 
 
     "name": "First child", 
 
     "child_id": 1 
 
     } 
 
    ] 
 
    } 
 
]; 
 
    
 
var response_items = []; 
 

 
//Process relays as individual devices 
 
test.forEach(function(device) { 
 

 
//Process relays as individual devices 
 
device.childs.forEach(function(child) { 
 
       var response_item = {}; 
 
\t response_item._id = device._id; 
 
    
 
\t response_item.name = child.name; 
 
\t response_item.child_id = child.child_id; 
 
\t //Return devices 
 
\t response_items.push(response_item); 
 
}); 
 

 
}); 
 

 
console.log(response_items);

+0

wie @squint sagte im Kommentar oben. Die innere Schleife überschreibt das Objekt, das Sie in der äußeren Schleife erstellt haben. Dies verhindert das Schließen, indem ein neues Objekt in der inneren Schleife erstellt wird. –

0

Verwenden Array.reduce() Ihren Array zu glätten, wie unten in einem reinen funktionalen Ansatz:

var test = [ 
 
    { 
 
    "_id": "1", 
 
    "childs": [ 
 
     { 
 
     "name": "First child", 
 
     "child_id": 1 
 
     }, 
 
     { 
 
     "name": "Second child", 
 
     "child_id": 2 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "_id": "2", 
 
    "childs": [ 
 
     { 
 
     "name": "First child", 
 
     "child_id": 1 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
var result = test.reduce(function (accumulator, current) { 
 
    var mappedRes = current.childs.map(function (item) { 
 
    item._id = current._id; 
 
    return item; 
 
    }); 
 
    return accumulator.concat(mappedRes); 
 
}, []); 
 

 
console.log(result);

Verwandte Themen