JavaScript- 数组对象根据相同对象分组
1. 需求说明
得到这样的一个对象数组
{ "id": "1001", "pId": "1001", "value": "111" }, { "id": "1001", "pId": "1001", "value": "11111" }, { "id": "1002", "pId": "1002", "value": "25462" }, { "id": "1002", "pId": "1002", "value": "23131" }, { "id": "1002", "pId": "1002", "value": "2315432" }, { "id": "1003", "pId": "1003", "value": "333333" }
根据相同id/pId/value字段分组,转换成下面这种形式
[ { "id": "1001", "pId": "1001", "data": [ {"id": "1001", "pId": "1001", "value": "111"}, { "id": "1001", "pId": "1001", "value": "11111"} ] }, { "id": "1002", "pId": "1002", "data": [ { "id": "1002", "pId": "1002", "value": "25462" }, { "id": "1002", "pId": "1002", "value": "23131"}, {"id": "1002", "pId": "1002","value": "2315432" } ] }, { "id": "1003", "pId": "1003", "data": [ {"id": "1003", "pId": "1003", "value": "333333" } ] } ]
2. 总结:完整示例代码
<script type="text/javascript">
var arr = [ // 加入得到该对象数组
{ "id": "1001", "pId": "1001", "value": "111" },
{ "id": "1001", "pId": "1001", "value": "11111" },
{ "id": "1002", "pId": "1002", "value": "25462" },
{ "id": "1002", "pId": "1002", "value": "23131" },
{ "id": "1002", "pId": "1002", "value": "2315432" },
{ "id": "1003", "pId": "1003", "value": "333333" }
];
var map = {} // 定义一个装新数组的容器
var dest = [] // 定义一个装新对象的容器
for (var i = 0; i < arr.length; i++) {
// 循环遍历拿到对象中的每个数组
var ai = arr[i];
if (!map[ai.pId]) { // 判断数组中是否为真(ai.pid)可以改成你想根据什么相同元素进行分组
// 为真组成新的对象
dest.push({
id: ai.id, // id
pId: ai.pId, // pid
children: [ai] // children分组后组名(与else中的dj.children对应)
})
map[ai.pId] = ai; // 得到分好组的新对象
// console.log('ai1', ai)
} else {
for (var j = 0; j < dest.length; j++) {
var dj = dest[j];
if (dj.id == ai.id) {
dj.children.push(ai);
break;
}
}
}
}
console.log('dest', dest)
</script>