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

我有以下两个要合并的对象。


[

    {

        "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

    }]

}

真的坚持如此复杂的合并,我只想要一次响应代码的值并合并响应消息的值。


在这里,我想从其他数组中删除响应代码值,并将响应消息值与第一个数组合并/分组。


肥皂起泡泡
浏览 150回答 3
3回答

qq_遁去的一_1

我为你准备了一个小功能:根据您在评论中提出的问题,连同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]));

小唯快跑啊

我已经通过下面的代码解决了数组合并问题。&nbsp; &nbsp; &nbsp; const mergedArray = [];&nbsp; &nbsp; &nbsp; myarray.forEach((obj, index) => {&nbsp; &nbsp; &nbsp; &nbsp; var newObj = {}&nbsp; &nbsp; &nbsp; &nbsp; if(index > 0){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(mergedArray.length > 0){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for(let i=0; i<obj.response_message.length;i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mergedArray[0].response_message.push(obj.response_message[i]);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObj["response_code"] = obj.response_code ;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newObj["response_message"] =&nbsp; obj.response_message;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mergedArray.push(newObj);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; })

POPMUISE

&nbsp; &nbsp;const arrayOf0 = yourArray.filter(item => item.response_code===0)&nbsp; &nbsp; const arrayOf1 = yourArray.filter(item => item.response_code===1)&nbsp; &nbsp; const merged0 = {response_code: 0, response_message: []};&nbsp; &nbsp; const merged1 = {response_code: 1, response_message: []};&nbsp; &nbsp; arrayOf0.forEach(item => {&nbsp;merged0.response_message.push(item.response_message[0]})&nbsp;&nbsp; &nbsp; arrayOf1.forEach(item => {&nbsp;merged1.response_message.push(item.response_message[0]})像这样的东西?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript