JavaScript- 数组对象根据相同对象分组

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>

 上一篇
localStorage和sessionStorage区别 localStorage和sessionStorage区别
localStorage和sessionStorage一样都是用来存储客户端临时信息的对象,他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)
2019-10-16
下一篇 
axios初识 axios初识
当应用非常复杂,状态非常多的时候,需要将store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块,从上至下进行同样方式的分割。
2019-08-10
  目录