【问题标题】:How to merge multiple array in JavaScript?如何在 JavaScript 中合并多个数组?
【发布时间】:2016-08-17 15:11:11
【问题描述】:

我有多个数组,我想将所有数组的数据合并到一个对象数组中。 所有的数据都会在key的基础上进行合并,那么如何制作一个生产级代码来合并所有的数据呢。

results[0]= 
    [ {categoryGroupID: '1231',categoryID: '12311',categoryName: 'External'},
    {categoryGroupID: '1231',categoryID: '12312',categoryName: 'Internal'},
    {categoryGroupID: '1231',categoryID: '141414141',categoryName: ''},
    {categoryGroupID: '1232',categoryID: '12321',categoryName: 'Style'},
    {categoryGroupID: '1233',categoryID: '123222',categoryName: ''},
    {categoryGroupID: '1233',categoryID: '12331',categoryName: 'Customer Satisfaction'}]

results[1]=
  [ { categoryGroupID: '1231',categoryGroupName: 'Store ambience'},
    { categoryGroupID: '1232',categoryGroupName: 'Communication'},
    {categoryGroupID: '1233',categoryGroupName: 'Overall Satisfaction'},
    {categoryGroupID: '12331',categoryGroupName: null}]


results[2]=
    [ {categoryID: '12311',questionID: '12311111',questionName: 'tell me snything'},
    {categoryID: '12312',questionID: '12311113',questionName: 'whatever'},
    {categoryID: '12311',questionID: '123ques',questionName: 'ashjsh'},
    {categoryID: '12311',questionID: '123test',questionName: null}]

results[3]=
  [ { questionID: '12311113',choiceID: '1231111111',choiceValue: 'good'},
    { questionID: '12311113',choiceID: '1231111112',choiceValue: 'very good'},
    {questionID: '12311113',choiceID: '12311113113',choiceValue: 'bad'}]

我的输出应该是这样的,所以怎么做

"categoryGroup": 
[
{"categoryGroupID": "1231","categoryGroupName": "Store ambience",
"category": [
    {"categoryID": "12312","categoryName": "Internal",   

                "question": [
                {"questionID": "12311113","questionName": "whatever",
                      "choice": [
                        {"choiceID": "1231111111","choiceValue": "good"},
                        {"choiceID": "1231111112","choiceValue": "very good"},
                        {"choiceID": "12311113113","choiceValue": "bad",}
                                 ],
            }]
        }, 
    {"categoryID": "12311","categoryName": "External",

            "question": [
                {"questionID": "12311111","questionName": "tell me snything",},
                {"questionID": "123ques","questionName": "ashjsh",}, 
                {"questionID": "123test","questionName": null,}
            ]}, 
    {"categoryID": "141414141","categoryName": "",}]
    }, 

{"categoryGroupID": "1232","categoryGroupName": "Communication",     
"category": [
    {"categoryID": "12321","categoryName": "Style"}]
     }, 

{"categoryGroupID": "1233","categoryGroupName": "Overall Satisfaction",
"category": [
    {"categoryID": "123222","categoryName": "",},
    {"categoryID": "12331","categoryName": "Customer Satisfaction",}]
    },

{"categoryGroupID": "12331","categoryGroupName": null}
]

【问题讨论】:

  • 我认为 vanilla JS 中没有任何开箱即用的解决方案
  • 那么如何使用 map 或 foreach 或任何其他概念来解决这个问题,你能帮我解决这个问题吗?
  • 看看那个:stackoverflow.com/questions/17500312/…,也许会有帮助
  • @ASN,我认为,您应该自己尝试一下,如果您仍然觉得困难,您可以发布您尝试过的代码,我们可以从那里开始工作。
  • 我尝试了不同的方法,但都做不到

标签: javascript arrays node.js


【解决方案1】:

在不深入了解所有这些以及您几乎需要手动处理所有情况的情况下,这里是一个可以工作的示例(可能不应该工作)。

这是基于结果的索引 (0, 1, 2, 3) 将始终相同并使用 filtermap Array 函数。就性能而言,我不确定这在大型场景中的效果如何。

var results = {};

results[0] =
    [{ categoryGroupID: '1231', categoryID: '12311', categoryName: 'External' },
    { categoryGroupID: '1231', categoryID: '12312', categoryName: 'Internal' },
    { categoryGroupID: '1231', categoryID: '141414141', categoryName: '' },
    { categoryGroupID: '1232', categoryID: '12321', categoryName: 'Style' },
    { categoryGroupID: '1233', categoryID: '123222', categoryName: '' },
    { categoryGroupID: '1233', categoryID: '12331', categoryName: 'Customer Satisfaction' }];

results[1] =
  [{ categoryGroupID: '1231', categoryGroupName: 'Store ambience' },
    { categoryGroupID: '1232', categoryGroupName: 'Communication' },
    { categoryGroupID: '1233', categoryGroupName: 'Overall Satisfaction' },
    { categoryGroupID: '12331', categoryGroupName: null }];


results[2] =
    [{ categoryID: '12311', questionID: '12311111', questionName: 'tell me snything' },
    { categoryID: '12312', questionID: '12311113', questionName: 'whatever' },
    { categoryID: '12311', questionID: '123ques', questionName: 'ashjsh' },
    { categoryID: '12311', questionID: '123test', questionName: null }];

results[3] =
  [{ questionID: '12311113', choiceID: '1231111111', choiceValue: 'good' },
    { questionID: '12311113', choiceID: '1231111112', choiceValue: 'very good' },
    { questionID: '12311113', choiceID: '12311113113', choiceValue: 'bad' }];



var o = {
    categoryGroup: results[1].map(function (categoryGroup) {
        var categoryGroup = {
            categoryGroupID: categoryGroup.categoryGroupID,
            categoryGroupName: categoryGroup.categoryGroupName
        };

        categoryGroup['category'] = results[0].filter(function (item) { return item.categoryGroupID == categoryGroup.categoryGroupID })
                                              .map(function (item) {
                                                  return {
                                                      categoryId: item.categoryID,
                                                      categoryName: item.categoryName,
                                                      question: results[2].filter(function (ques) { return ques.categoryID == item.categoryID })
                                                                          .map(function (ques) {
                                                                              return {
                                                                                  questionId: ques.questionID,
                                                                                  questionName: ques.questionName,
                                                                                  choice: results[3].filter(function (ch) { return ch.questionID == ques.questionID })
                                                                                                    .map(function (ch) {
                                                                                                        return {
                                                                                                            choiceID: ch.choiceID,
                                                                                                            choiceValue: ch.choiceValue
                                                                                                        }
                                                                                                    })
                                                                              }
                                                                          })
                                                  };
                                              });
        return categoryGroup;
    })
};
console.log(o);

【讨论】:

    【解决方案2】:

    看到这个-> How to merge two arrays in Javascript and de-duplicate items

    var array1 = ["1","2"];
    var array2 = ["3", "4"];
    
    var array3 = array1.concat(array2); // Merges both arrays
    // [ '1', '2', '3', '4' ] 
    

    对于 Apache Commons Lang Array Utils,请参见 -> How can I concatenate two arrays in Java?

    js 版本是 dojo http://dojotoolkit.org/reference-guide/1.10/dojo/_base/array.htmlutil-array https://www.npmjs.com/package/util-array

    这是另一个道场示例http://dojo-toolkit.33424.n3.nabble.com/How-to-concatenate-arrays-in-Dojo-td3744293.html

    http://wiki.servicenow.com/index.php?title=ArrayUtil

    【讨论】:

    • 但我正在使用 javascript
    • OP 希望他的解决方案在 'Javascript' 中
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2019-03-04
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多