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); // 最终输出
    },
复制代码

 

posted @   _whys  阅读(13342)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示