// 输入
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" }]
]
}