查詢陣列中相似欄位(陣列裡面某個值相似歸類到一起)

Qing`ing發表於2024-11-29

例如↓陣列中每條資料的url欄位相似

arr = [
    {
      id:0,
      dir:'/edit/aaaa/bbbb/cccc/dddd/20231123',
      title:'第一條資料'
    },
   {
      id:1,
      dir:'/edit/aaaa/bbbb/cccc/dddd/20241011',
      title:'第二條資料'
    },
   {
      id:2,
      dir:'/edit/aaaa/bbbb/cccc/dddd/20240623',
      title:'第三條資料'
    },
   {
      id:3,
      dir:'/edit/aaaa/bbbb/cccc/dddd/20240313',
      title:'第四條資料'
    },
   {
      id:4,
      dir:'/edit/aaaa/bbbb/cccc/dddd/20241224/12',
       title:'第五條資料'
    }, 
] 

變成↓

arr = [
    {
    id:0,
    dir:'/edit/aaaa/bbbb/cccc/dddd/20231123',
    title:'第一條資料',
   children:[{
        id:1,
        dir:'/edit/aaaa/bbbb/cccc/dddd/20241011',
        title:'第二條資料'
      },
     {
        id:2,
        dir:'/edit/aaaa/bbbb/cccc/dddd/20240623',
        title:'第三條資料'
      },
     {
        id:3,
        dir:'/edit/aaaa/bbbb/cccc/dddd/20240313',
        title:'第四條資料'
      },
     {
        id:4,
        dir:'/edit/aaaa/bbbb/cccc/dddd/20241224/12',
         title:'第五條資料'
      }]
   }
]

實現方法

 unique5(data) {
            var result = []; var hash = {};
            let sum;
            for (var i = 0; i < data.length; i++) {
          //擷取出來相似的部分 (/edit/aaaa/bbbb/ccc/ddd)
                if ((data[i].dir.slice(data[i].dir.lastIndexOf('/')) +'').length=== 9) {  //判斷是否為時間
                    sum = data[i].dir.slice(0, data[i].dir.lastIndexOf('/')); 
                } else {  //例如第五條資料特殊資料判斷
                    const lastIndex = data[i].dir.lastIndexOf('/');
                    sum = data[i].dir.slice(0, data[i].dir.lastIndexOf('/', lastIndex - 1));
                }

                if (!hash[sum]) {//不存在加進去
                    result.push({...data[i], children: []});
                    hash[sum] = true;
                } else { // 已存在 加入 children 裡面
                    const dindData = result.find(item => {
                        return item.dir.includes(sum);
                    });
                    dindData ? dindData.children.push({...data[i]}) : null;
                }
            }

            return result;
        },

相關文章