zoukankan      html  css  js  c++  java
  • JS 数组对象根据某一相同key合并成新的数组

    很久没写随笔了,可能太安逸了!!!

    例子:

        let arr = [
          { name: '小明',age: 20,school: '清华' },
          { name: '小红',age: 21,school: '清华' },
          { name: '小白',age: 18,school: '北大' },
          { name: '小黄',age: 19,school: '北大' },
          { name: '小浪',age: 21,school: '哈佛' },
        ]

    需求是将具有相同 “school” 的对象合并为新的数组

    结果如下:

        let data = [
          {
            school: "清华",
            children: [
              { name: "小明", age: 20, school: "清华" },
              { name: "小红", age: 21, school: "清华" },
            ]
          },
          {
            school: "北大",
            children: [
              { name: "小白", age: 18, school: "北大" },
              { name: "小黄", age: 19, school: "北大" },
            ]
          },
          {
            school: "哈佛",
            children: [
              { name: "小浪", age: 21, school: "哈佛" },
            ]
          },
        ]

    解决方案一:

        handlerDatas(arr){
          // arr 传过来的原数组  
          let tempArr = [];
          let endData = [];
          for (let i = 0; i < arr.length; i++) {
            if (tempArr.indexOf(arr[i].school) === -1) {
              endData.push({
                school: arr[i].school,
                children: [arr[i]]
              });
              tempArr.push(arr[i].school);
            } else {
              for (let j = 0; j < endData.length; j++) {
                if (endData[j].school == arr[i].school) {
                  endData[j].children.push(arr[i]);
                  break;
                }
              }
            }
          }
          console.log(endData); // 最终输出
        },

    解决方案二:

        handlerDatas(arr){
          let obj = {};
          arr.forEach((item, index) => {
              let { school } = item;
              if (!obj[school]) {
                  obj[school] = {
                      school,
                      children: []
                  }
              }
              obj[school].children.push(item);
          });
          let data = Object.values(obj); // 最终输出
        },

    还有其它的方案,可以自行百度。

    以上解决方案借鉴了其他博主的文章

    扩展延伸: 将数组对象改成对象数组

        let arr = [
          { name: '小明',age: 20,school: 'qinghua',},
          { name: '小红',age: 21,school: 'qinghua',},
          { name: '小白',age: 18,school: 'beida',},
          { name: '小黄',age: 19,school: 'beida',},
          { name: '小浪',age: 21,school: 'hafo',},
        ]
    
        handlerDatas(arr){
          let obj = {};
          arr.forEach((item, index) => {
              let { school } = item;
              if (!obj[school]) {
                  obj[school] = {
                school,
                      children: []
                  }
              }
              obj[school].children.push(item);
          });
          let data = Object.values(obj);
          let newData = {};
    
          data.forEach((item, i) => {
            let key = item.school;
            let value = item.children;
            newData[key] = value;
          });
          console.log(newData); // 最终输出
        },
  • 相关阅读:
    hihoCoder 1308:搜索二·骑士问题(BFS预处理)
    BZOJ 1085:[SCOI2005]骑士精神(A*算法)
    HDU 6181:Two Paths(A* + SPFA)
    Linux常用命令之用户权限管理chmod、chown、chgrp、umask命令讲解
    Linux常用命令之cp、mv、rm、cat、more、head、tail、ln命令讲解
    Linux常用命令之ls、cd、pwd、mkdir命令讲解
    第一次在虚拟机启动我们的Linux系统
    Linux学习环境搭建
    centos7重启apache、nginx、mysql、php-fpm命令
    返回一条最近一次cURL操作明确的文本的错误信息。
  • 原文地址:https://www.cnblogs.com/wyhlightstar/p/12957765.html
Copyright © 2011-2022 走看看