2016-08-17 3 views
-4

Ich habe zwei verschiedene Array von Objekten. Und ich muss die beiden Array von Objekten verschachtelt verschmelzen.So verschmelzen zwei verschiedene Array von Objekten mit Javascript

var array1=[{ PersonalID: '11', qusetionNumber: '1', value: 'Something' }, 
       { PersonalID: '12', qusetionNumber: '2', value: 'whatever' }, 
       { PersonalID: '13', qusetionNumber: '3', value: 'anything' }, 
       { PersonalID: '14', qusetionNumber: '4', value: 'null' }]; 

var array2=[{ qusetionNumber: '2', chID: '111', cValue: 'red' }, 
      { qusetionNumber: '2', chID: '112', cValue: 'green'}, 
      { qusetionNumber: '2', chID: '113', cValue: 'blue' }, 
      {qusetionNumber: '3', choiceID: '114', cValue: 'yellow'}, 
      {qusetionNumber: '4', choiceID: '115', cValue: 'red'}]; 

die Ausgabe sollte in diesem Format sein Also, wie man es mit Schleife oder Unterstrich machen? OUTPUT

personalID:[{ 
      personalID:11, 
      qusetionNumber:1, 
      value: 'Something' 
      }, 
       { 
      personalID:12, 
      qusetionNumber:2, 
      value: 'whatever', 
      choice:[       
       { qusetionNumber: '2', chID: '111', cValue: 'red' }, 
         { qusetionNumber: '2', chID: '112', cValue: 'green'}, 
         { qusetionNumber: '2', chID: '113', cValue: 'blue' } 
       ] 
      }, 
      { 
      personalID:13, 
      qusetionNumber:3, 
      value: 'anything', 
      choice:[       
       { qusetionNumber: '3', chID: '114', cValue: 'yellow' } 
          ] 
       }, 
       { 
      personalID:14, 
      qusetionNumber:4, 
      value: 'null', 
      choice:[       
       { qusetionNumber: '4', chID: '115', cValue: 'red' } 
          ] 
       }] 
+0

Ich habe versucht mit Forloop, aber ich bekomme nicht das richtige Ergebnis –

+0

'groupBy' auf dem Array2, gefolgt von' map' auf array1 – Gant

+0

können Sie bitte den Code teilen, wie Sie es tun? –

Antwort

0

Sie eine Hash-Tabelle als Hinweis auf das Recht nutzen könnten questionNumber und bauen eine neue Eigenschaft choice, falls erforderlich.

var array1 = [{ PersonalID: '11', questionNumber: '1', value: 'Something' }, { PersonalID: '12', questionNumber: '2', value: 'whatever' }, { PersonalID: '13', questionNumber: '3', value: 'anything' }, { PersonalID: '14', questionNumber: '4', value: 'null' }], 
 
    array2 = [{ questionNumber: '2', chID: '111', cValue: 'red' }, { questionNumber: '2', chID: '112', cValue: 'green' }, { questionNumber: '2', chID: '113', cValue: 'blue' }, { questionNumber: '3', choiceID: '114', cValue: 'yellow' }, { questionNumber: '4', choiceID: '115', cValue: 'red' }], 
 
    hash = Object.create(null); 
 

 
array1.forEach(function (a) { 
 
    hash[a.questionNumber] = a; 
 
}); 
 

 
array2.forEach(function (a) { 
 
    if (hash[a.questionNumber]) { 
 
     hash[a.questionNumber].choice = hash[a.questionNumber].choice || []; 
 
     hash[a.questionNumber].choice.push(a); 
 
    } 
 
}); 
 

 
console.log(array1);

+0

hash [a.questionNumber] .choice = hash [a.questionNumber] .choice || [];^ TypeError: Kann die Eigenschaft 'choice' von undefined nicht lesen, die den obigen Fehler –

+0

gibt, können Sie eine Überprüfung hinzufügen, wenn die 'questionNumber'-Referenz vorhanden ist. –

+0

Ich habe den Fehler zu lösen, aber ich bin nicht in der Lage, alle die Wahl zu bekommen..Mittel für die personalID: '12 'Ich bekomme alle die Wahl, aber für andere ich bin nicht –

0

Sie können dies auf folgende Weise nur Vanille JS verwenden.

Beispiel in modernen ES6 +

var array3 = array1.map(question => { 
    let newQuestion = Object.assign({},question); // In order not to mutate the items array1 
    newQuestion.choice = array2.filter(choice => choice.qusetionNumber === question.qusetionNumber); 
    return newQuestion; 
}); 

Ältere Syntax:

var array3 = array1.map(function(question) { 
    var newQuestion = Object.assign({},question); // In order not to mutate the items array1 
    newQuestion.choice = array2.filter(function(choice){ return choice.qusetionNumber === question.qusetionNumber}); 
    return newQuestion; 
}); 

Wenn Sie nicht auf Object.assign zur Verfügung stehen zählen können, können Sie die assign Funktion in lodash oder erweitern in Strich oder jQuery verwenden können

var array1 = [{ 
 
    PersonalID: '11', 
 
    qusetionNumber: '1', 
 
    value: 'Something' 
 
}, { 
 
    PersonalID: '12', 
 
    qusetionNumber: '2', 
 
    value: 'whatever' 
 
}, { 
 
    PersonalID: '13', 
 
    qusetionNumber: '3', 
 
    value: 'anything' 
 
}, { 
 
    PersonalID: '14', 
 
    qusetionNumber: '4', 
 
    value: 'null' 
 
}]; 
 

 
var array2 = [{ 
 
    qusetionNumber: '2', 
 
    chID: '111', 
 
    cValue: 'red' 
 
}, { 
 
    qusetionNumber: '2', 
 
    chID: '112', 
 
    cValue: 'green' 
 
}, { 
 
    qusetionNumber: '2', 
 
    chID: '113', 
 
    cValue: 'blue' 
 
}, { 
 
    qusetionNumber: '3', 
 
    choiceID: '114', 
 
    cValue: 'yellow' 
 
}, { 
 
    qusetionNumber: '4', 
 
    choiceID: '115', 
 
    cValue: 'red' 
 
}]; 
 

 
var array3 = array1.map(function(question) { 
 
    var newQuestion = Object.assign({}, question); // In order not to mutate the items array1 
 
    newQuestion.choice = array2.filter(function(choice) { 
 
    return choice.qusetionNumber === question.qusetionNumber 
 
    }); 
 
    return newQuestion; 
 
}); 
 

 
console.log(JSON.stringify(array3, null, 4));

Ergebnis:

[ { "PersonalID": "11", "qusetionNumber": "1", "value": "Something", "choice": [] }, { "PersonalID": "12", "qusetionNumber": "2", "value": "whatever", "choice": [ { "qusetionNumber": "2", "chID": "111", "cValue": "red" }, { "qusetionNumber": "2", "chID": "112", "cValue": "green" }, { "qusetionNumber": "2", "chID": "113", "cValue": "blue" } ] }, { "PersonalID": "13", "qusetionNumber": "3", "value": "anything", "choice": [ { "qusetionNumber": "3", "choiceID": "114", "cValue": "yellow" } ] }, { "PersonalID": "14", "qusetionNumber": "4", "value": "null", "choice": [ { "qusetionNumber": "4", "choiceID": "115", "cValue": "red" } ] } ]

+0

Außer PersonID: '12 'Ich werde nicht die Wahl für andere bekommen. –

0

Das ist meine Lösung ist, wird es vielleicht hilfreich

var array1=[{ PersonalID: '11', qusetionNumber: '1', value: 'Something' }, 
       { PersonalID: '12', qusetionNumber: '2', value: 'whatever' }, 
       { PersonalID: '13', qusetionNumber: '3', value: 'anything' }, 
       { PersonalID: '14', qusetionNumber: '4', value: 'null' }]; 
var array2=[{ qusetionNumber: '2', chID: '111', cValue: 'red' }, 
      { qusetionNumber: '2', chID: '112', cValue: 'green'}, 
      { qusetionNumber: '2', chID: '113', cValue: 'blue' }, 
      {qusetionNumber: '3', choiceID: '114', cValue: 'yellow'}, 
      {qusetionNumber: '4', choiceID: '115', cValue: 'red'}]; 

var i = -1; 
array1.forEach(function(a){ 
var arrayWithQuestions = []; 
    array2.forEach(function(y){ 
    if(a.qusetionNumber == y.qusetionNumber){ 
     i++; 
     arrayWithQuestions.push(array2[i]);   
    } 
    }) 
    if(arrayWithQuestions.length!=0){ 
    a.choice = arrayWithQuestions; 
    } 
    console.log(arrayWithQuestions); 
}) 
console.log('how array1 looks like'); 
console.log(array1); 

Ergebnis sein:

[ 
    { 
     "PersonalID":"11", 
     "qusetionNumber":"1", 
     "value":"Something" 
    }, 
    { 
     "PersonalID":"12", 
     "qusetionNumber":"2", 
     "value":"whatever", 
     "choice":[ 
      {"qusetionNumber":"2","chID":"111","cValue": "red"}, 
      {"qusetionNumber":"2", "chID":"112","cValue":"green"}, 
      {"qusetionNumber":"2", "chID":"113", "cValue":"blue"} 
      ] 
    }, 
    { 
     "PersonalID":"13", 
     "qusetionNumber":"3", 
     "value":"anything", 
     "choice": [ 
      {"qusetionNumber":"3", "choiceID":"114", "cValue":"yellow"} 
     ] 
    }, 
    { 
    "PersonalID":"14", 
    "qusetionNumber":"4", 
    "value":"null", 
    "choice": [ 
     {"qusetionNumber":"4", "choiceID":"115", "cValue":"red"} 
     ] 
    } 
] 

see jsfiddle

Verwandte Themen