1. 程式人生 > 實用技巧 >陣列物件相同的key值合併,並且把對應的id放到一個數組

陣列物件相同的key值合併,並且把對應的id放到一個數組

1:陣列物件相同的key值合併,並且把對應的id放到一個數組

準備資料

let list = [{
            name: 'a',
            id: 1,
            age: 11
        }, {
            name: 'b',
            id: 2,
            age: 22
        }, {
            name: 'c',
            id: 3,
            age: 33
        }, {
            name: 'a',
            id: 4,
            age: 44
        }, {
            name: 'b',
            id: 5,
            age: 55
        }];

處理結果

[{name:'a',id:[1,4]},{name:'b',id:[2,5]},{name:'c',id:[3]}]

第一種:利用find查詢的方式處理

find() 方法返回陣列中滿足提供的測試函式的第一個元素的值。否則返回 undefined。

<!--首先定義一個空陣列-->
var newList = []
list.forEach(item => {
            let newItem = newList.find((i) => i.name == item.name)
            if (!newItem) {
                console.log(newItem);
                newList.push({
                    name: item.name,
                    id: [item.id]
                })
            } else {
                newItem.id.push(item.id)
            }
        })

第二中:利用reduce方法

let Obj = list.reduce((pre,cur,index)=> {
            if(!pre[cur.name]){
                pre[cur["name"]] =[cur.id]
            } else {
                pre[cur.name].push(cur.id)
            }
            return pre;
        },{})
        let aff= Object.keys(Obj).map((item)=>{
            console.log(item);
        return {
                name:item,
                id:Obj[item]
        }})
        console.log(aff)

第三種使用hash物件

var hash = {};
var i = 0;
var res = [];
list.forEach(function(item) {
    var name = item.name;
    hash[name] ? res[hash[name] - 1].id.push(item.id) : hash[name] = ++i && res.push({
        id: [item.id],
        name: name,
        age: item.age
    })

});