为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用节点js中的键对两个数组进行分组

如何使用节点js中的键对两个数组进行分组

肥皂起泡泡 2022-05-22 16:18:01
我有以下两个要合并的对象。[    {        "response_code": 1,        "response_message": [{            "a": 1000,            "b": 1000001,            "c": 10000002        }]    }][    {        "response_code": 1,        "response_message": [{            "a": 2000,            "b": 2000001,            "c": 20000002        }]    }]我想通过只有一个响应代码值和如下方式合并响应消息值来合并它们,如下所示。{    "response_code": 1,    "response_message": [    {        "a": 1000,        "b": 1000001,        "c": 10000002    },    {        "a": 2000,        "b": 2000001,        "c": 20000002    }]}真的坚持如此复杂的合并,我只想要一次响应代码的值并合并响应消息的值。在这里,我想从其他数组中删除响应代码值,并将响应消息值与第一个数组合并/分组。
查看完整描述

3 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

我为你准备了一个小功能:


根据您在评论中提出的问题,连同response_message字符串的测试用例,我编辑了代码片段以包含多个要测试的用例。


const inputs = [

    [{

            "response_code": 1,

            "response_message": [{

                "a": 1000,

                "b": 1000001,

                "c": 10000002

            }]

        },


        {

            "response_code": 1,

            "response_message": [{

                "p": 1000,

                "q": 1000001,

                "r": 10000002

            }]

        }

    ],

    [{

            "response_code": 1,

            "response_message": [{

                "a": 1000,

                "b": 1000001,

                "c": 10000002

            }]

        },

        {

            "response_code": 1,

            "response_message": 'No data'

        }

    ],

    [{

            "response_code": 1,

            "response_message": 'No data'

        },

        {

            "response_code": 1,

            "response_message": 'No data'

        }

    ]


]


const getGroupedArr = (arr) => {

    const codeMap = arr.reduce((cMap,obj) => {

        let existingMessageArr = cMap.get(obj.response_code);

        let arrayToAdd = Array.isArray(obj.response_message) ? obj.response_message : [];

        if(existingMessageArr){

            existingMessageArr.push(...arrayToAdd);

        } else {

            cMap.set(obj.response_code,arrayToAdd);

        }

        return cMap;

    },new Map());

    const iterator = codeMap[Symbol.iterator]();

    const resultArr = [];

    for (let item of iterator) {

        resultArr.push({

            response_code: item[0],

            response_message: item[1]

        })

    }

    return resultArr;

}


inputs.forEach((inputArr,index) => {

    console.log(`Result for input ${index+1}`,getGroupedArr(inputArr));

})


请注意,我Map在 JS 中使用了大多数人更喜欢对象的位置,因为 JS 中的映射是可迭代的,但是对于一个对象,我不得不做一个额外的Object.keys()步骤,所以这使得它比对象方法稍微更有效,虽然有点冗长.


另请注意,在第三种情况下,当具有特定对象的对象没有response_code任何数据时,结果将是一个空数组而不是字符串。在像 JS 这样的弱类型环境中,保持某种类型一致性始终是一个好习惯(这实际上使得 'No data' 的输入值response_code并不理想),否则您可能需要在任何地方进行类型检查(比如在编辑的函数中)在上面的片段中)。


当具有相同的对象response_code存在于两个不同的数组中时(两个输入数组可以简单地合并为一个),可以在评论中提到的约束中使用相同的函数:


const inputArr1 = [{

            "response_code": 1,

            "response_message": [{

                "a": 1000,

                "b": 1000001,

                "c": 10000002

            }]

        }]


const inputArr2 = [{

            "response_code": 1,

            "response_message": [{

                "p": 1000,

                "q": 1000001,

                "r": 10000002

            }]

        }]


const getGroupedArr = (arr) => {

    const codeMap = arr.reduce((cMap,obj) => {

        let existingMessageArr = cMap.get(obj.response_code);

        let arrayToAdd = Array.isArray(obj.response_message) ? obj.response_message : [];

        if(existingMessageArr){

            existingMessageArr.push(...arrayToAdd);

        } else {

            cMap.set(obj.response_code,arrayToAdd);

        }

        return cMap;

    },new Map());

    const iterator = codeMap[Symbol.iterator]();

    const resultArr = [];

    for (let item of iterator) {

        resultArr.push({

            response_code: item[0],

            response_message: item[1]

        })

    }

    return resultArr;

}



console.log(getGroupedArr([...inputArr1,...inputArr2]));


查看完整回答
反对 回复 2022-05-22
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

我已经通过下面的代码解决了数组合并问题。


      const mergedArray = [];

      myarray.forEach((obj, index) => {

        var newObj = {}

        if(index > 0){

          if(mergedArray.length > 0){

            for(let i=0; i<obj.response_message.length;i++){

              mergedArray[0].response_message.push(obj.response_message[i]);

            }

          }

        }else{

          newObj["response_code"] = obj.response_code ;

          newObj["response_message"] =  obj.response_message;

          mergedArray.push(newObj);

             }

      })


查看完整回答
反对 回复 2022-05-22
?
POPMUISE

TA贡献1765条经验 获得超5个赞

   const arrayOf0 = yourArray.filter(item => item.response_code===0)

    const arrayOf1 = yourArray.filter(item => item.response_code===1)

    const merged0 = {response_code: 0, response_message: []};

    const merged1 = {response_code: 1, response_message: []};

    arrayOf0.forEach(item => { 

merged0.response_message.push(item.response_message[0]

}) 

    arrayOf1.forEach(item => {

 merged1.response_message.push(item.response_message[0]

})

像这样的东西?


查看完整回答
反对 回复 2022-05-22
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号