Dismiss
Announcing Stack Overflow Documentation

We started with Q&A. Technical documentation is next, and we need your help.

Whether you're a beginner or an experienced developer, you can contribute.

Sign up and start helping → Learn more about Documentation →

I have two different array of objects.And i have to merge the two array of objects in nested way.

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'}];

the Output should be In this format So how to make it using loop or underscore? 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' }
                           ] 
               }]
share|improve this question
    
What have you tried ? – Oxi Aug 17 at 10:16
    
i have tried using forloop but i am not getting the proper result – Akash Sourav Nayak Aug 17 at 10:19
    
groupBy on the array2, followed by map on array1 – Gant Aug 17 at 10:19
    
can you please share the code how you are doing? – Akash Sourav Nayak Aug 17 at 10:20

You could use a hash table as reference to the right questionNumber and build a new property choice if necessary.

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);

share|improve this answer
    
hash[a.questionNumber].choice = hash[a.questionNumber].choice || []; ^ TypeError: Cannot read property 'choice' of undefined its giving the above error – Akash Sourav Nayak Aug 17 at 10:33
    
you can add a check if the questionNumber reference exists. – Nina Scholz Aug 17 at 10:43
    
i have resolve the error but i am not able to get all the choice..means for the personalID:'12' i am getting all the choice but for others i am not getting – Akash Sourav Nayak Aug 17 at 11:03
    
maybe it's because i changed the property name to questionNumber, without typo. – Nina Scholz Aug 17 at 11:06
    
So any suggestion – Akash Sourav Nayak Aug 17 at 11:09

This is my solution, maybe it will be helpful

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);

Result:

[
    {
        "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

share|improve this answer

You can do this in the following manner using only vanilla JS.

Sample in modern 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;
});

Older 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;
});

If you cannot count on Object.assign being available, you can use the assign function in lodash or extend in underscore or jQuery

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));

Result:

[ { "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" } ] } ]

share|improve this answer
    
Except PersonID:'12 'I amn't getting the choice for others. – Akash Sourav Nayak Aug 17 at 11:11

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.