【问题标题】:How to merge two different array of objects using javascript如何使用javascript合并两个不同的对象数组
【发布时间】:2016-08-17 10:14:42
【问题描述】:

我有两个不同的对象数组。我必须以嵌套方式合并两个对象数组。

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

输出应该是这种格式 那么如何使用循环或下划线来制作呢? 输出

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

【问题讨论】:

  • 我尝试过使用 forloop 但我没有得到正确的结果
  • groupBy 在 array2 上,然后是 map 在 array1 上
  • 你能分享一下你的代码吗?

标签: javascript node.js javascript-objects


【解决方案1】:

您可以使用哈希表作为对右侧questionNumber 的引用,并在必要时构建一个新属性choice

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

【讨论】:

  • hash[a.questionNumber].choice = hash[a.questionNumber].choice || []; ^ TypeError: Cannot read property 'choice' of undefined 它给出了上述错误
  • 您可以添加检查questionNumber 引用是否存在。
  • 我已经解决了错误,但我无法获得所有选择..表示个人 ID:'12' 我获得了所有选择,但对于其他人我没有获得
  • 可能是因为我把属性名改成了questionNumber,没有错别字。
  • 我面临同样的问题
【解决方案2】:

这是我的解决方案,也许会有所帮助

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

结果:

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

【讨论】:

    【解决方案3】:

    您可以通过以下方式仅使用 vanilla JS 来执行此操作。

    现代 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;
    });
    

    旧语法:

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

    如果你不能指望 Object.assign 可用,你可以在 lodash 中使用 assign 函数,或者在下划线或 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));

    结果:

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

    【讨论】:

    • Except PersonID:'12 '我无法为其他人选择。
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多