JavaScript 中根据相同 key 对应的值,将一维数组转换为二维数据

// 输入
const input = [
    { code: "China", name: "xiaohuai" },
    { code: "Africa", name: "neiLuoBi" },
    { code: "Asia", name: "hanGuo" },
    { code: "China", name: "tnnyang" },
    { code: "Africa", name: "nanFei" },
    { code: "China", name: "yangMan" }
]
// 输出
const output = [
    { "code": "China", "list": ["xiaohuai", "tnnyang", "yangMan"] },
    { "code": "Africa", "list": ["neiLuoBi", "nanFei"] },
    { "code": "Asia", "list": ["hanGuo"] }
]

从 input 和 output 两个数组中可以看出,使用 code 进行分组,将 code 值相同的 name 放入到 list 数组中。
实现思路:遍历 input 数组,使用 obj 对象存储以 code 为 key,遍历项为 value,同时向结果集 result 中添加该数据,如果 obj[code] 已经存在了,直接遍历 result,找到相同的 code,添加 name 到 list 中即可。具体代码实现如下:

function oneConvertTwoArray(arr, sameKey = 'code', mergeKey = 'name') {
    let result = []; let obj = {}
    arr.forEach(item => {
        if (!obj[item[sameKey]]) {
            result.push({
                [sameKey]: item[sameKey],
                list: [item[mergeKey]],
            })
            obj[item[sameKey]] = item
        } else {
            result.forEach(row => {
                if (row[sameKey] === item[sameKey]) {
                    row.list.push(item[mergeKey])
                }
            })
        }
    })
    return result
}
// 调用
console.log(oneConvertTwoArray(input))

上述中我们注意利用了对象 obj 键的唯一性,当然我们也可以使用 Map 来实现。代码实现如下:

function oneConvertTwoArray(arr) {
    var map = new Map();
    arr.forEach(item => {
        map.has(item.code) ? map.get(item.code).push(item) : map.set(item.code, [item]);
    })
    return { keys: [...map.keys()], values: [...map.values()] }
}
// 输出结果如下:
{
    "keys": ["China", "Africa", "Asia"],
    "values": [
        [{ "code": "China", "name": "xiaohuai" }, { "code": "China", "name": "tnnyang" }, { "code": "China", "name": "yangMan" }],
        [{ "code": "Africa", "name": "neiLuoBi" }, { "code": "Africa", "name": "nanFei" }],
        [{ "code": "Asia", "name": "hanGuo" }]
    ]
}

你可能感兴趣的:(javascript,windows,开发语言)