合并数组对象中key相同的数据(将数组里某个属性相同的对象合并成一个数组)

448 阅读1分钟

转换前的数据:

let resData =

[

{ "name": "路飞", "teamName": "草帽海贼团" },
{ "name": "索隆", "teamName": "草帽海贼团"}, 
{ "name": "红发", "teamName": "红发海贼团"},
{ "name": "罗宾", "teamName": "草帽海贼团"}, 
{ "name": "不死鸟", "teamName": "白胡子海贼团",}, 
{ "name": "艾斯", "teamName": "白胡子海贼团", } 

]

转换后的数据:

let resData = [

{
    "teamName":"草帽海贼团",
    "sourceList":[
        {"name":"路飞","tagName":"草帽海贼团"},
        {"name":"索隆","tagName":"草帽海贼团"},
        {"name":"罗宾","tagName":"草帽海贼团"}
    ]
},
{
    "teamName":"红发海贼团",
    "sourceList":[
        { "name": "红发", "tagName": "红发海贼团"}
    ]
},
 {
    "teamName":"白胡子海贼团",
    "sourceList":[
        {
            "sourceList":[
                { "name": "红发", "tagName": "白胡子海贼团"}
            ]
        }
    ]
}

]

方案一:

let temp = [];

let Data = [];

for (let i = 0; i < resData.length; i++) {

if (temp.indexOf(resData[i].teamName) === -1) { 

    Data.push({ teamName: resData[i].teamName, dataInfo: [resData[i]] }); 

    temp.push(resData[i].teamName); 

} else { 

    for (let j = 0; j < Data.length; j++) { 

        if (Data[j].teamName == resData[i].teamName) {

            Data[j].sourceList.push(resData[i]); break; 

        } 

    }

} 

}

方法二:

let sourceList = {};

resData.forEach((item, index) => {

let { teamName } = item;

if (!sourceList[teamName]) {

sourceList[teamName] = { teamName, child: [] }

}

sourceList[teamName].child.push(item); 

});

let list = Object.values(sourceList); // list 转换成功的数据