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" }]
    ]
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值