javascript - Array合并
天蓬老师
天蓬老师 2017-04-11 12:50:28
[JavaScript讨论组]

from

[
    {
        name: 'Lee',
        class: '002',
        number: 1
    },
    {
        name: 'Lee',
        class: '003',
        number: 3
    },
    {
        name: 'Karina',
        class: '001',
        number: 2
    }
]

to

[
    {
        name: 'Lee',
        info: [
            {
                class: '001',
                number: 1
            },
            {
                class: '003',
                number: 3
            }
        ]
    },
    {
        name: 'Karina',
        info: [
            {
                class: '001',
                number: 2
            }
        ]
    }
]

怎么实现?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(6)
PHP中文网

亲测可以,只要给的数据按姓名排好

            var emm=[];var k=0;var msl = oarr[0].name;
            $.each(oarr,function(i,j){
                if(i){
                    if(msl!=j.name) k++;
                } 
                if(!emm[k]){
                    emm[k]={};
                    
                }
                
                emm[k]['name']=j.name;

                if(!emm[k]['info']) {
                    emm[k]['info']=[];
                }
                delete j.name;
                emm[k]['info'].push(j);
                
            })
        
        console.log(emm)
迷茫
var obj = {} , arr = [];
a.forEach(function( item ){
    var _o = {};
    for( p in item ){
        if( p !== "name"){
            _o[p] = item[p];
        }
    }
    if( item.name in obj ){
        obj[item.name].push(_o);
    }else{
        obj[item.name] = [_o];
    }
});
for( p in obj ){
    arr.push({ "name" : p , "info" : obj[p] });
}

a是那个原始数组

怪我咯

帮你写了个函数

function together(oldArr){
    var newArr = [];
    for(var i = 0; i<oldArr.length; i++){ //这里不能缓存length,因为它将变动
        var obj = {name:'', info:[]},arr;
        obj.name = oldArr[i].name;
        obj.info.push({class: oldArr[i].class, number: oldArr[i].number});
        for(var j = i+1;j<oldArr.length;j++){
            if(oldArr[j].name === oldArr[i].name){
                arr = oldArr.splice(j--,1);
                obj.info.push({class: arr[0].class, number: arr[0].number})
            }
        }
        newArr.push(obj);
    }
    return newArr
}
黄舟
var sourceArray = [
    {
        name: 'Lee',
        class: '002',
        number: 1
    },
    {
        name: 'Lee',
        class: '003',
        number: 3
    },
    {
        name: 'Karina',
        class: '001',
        number: 2
    }
];
var resultArray = sourceArray.sort(function (objOne, objTwo){
   return objOne.name === objTwo.name;
}).reduce(function(rest, objItem, index){
   if(index === 0 || rest[rest.length - 1].name !== objItem.name){
      rest.push({
          name: objItem.name,
        info: [{ class: objItem.class, number: objItem.number }]
      });
    } else {
      rest[rest.length - 1].info.push({ class: objItem.class, number: objItem.number });
    }
    return rest;
}, []);

// 输出结果
console.log(resultArray)
大家讲道理

就用 reduce 解决吧

const from = [
    {
        name: "Lee",
        class: "002",
        number: 1
    },
    {
        name: "Lee",
        class: "003",
        number: 3
    },
    {
        name: "Karina",
        class: "001",
        number: 2
    }
];

const to = from.reduce((r, t) => {
    let info = r.infoMap[t.name];

    if (!info) {
        info = [];
        r.list.push({
            name: t.name,
            info: info
        });
        r.infoMap[t.name] = info;
    }

    info.push({
        class: t.class,
        number: t.number
    });

    return r;
}, { list: [], infoMap: [] }).list;

console.log(JSON.stringify(to, null, 4));

forEach 可能更容易理解一点,顺便把关键算法换个方法

const to = ((data) => {
    const list = [];
    const infoMap = {};

    data.forEach(t => {
        let info = infoMap[t.name] = infoMap[t.name] || [];
        info.push({
            class: t.class,
            number: t.number
        });

        if (info.length === 1) {
            list.push({
                name: t.name,
                info: info
            });
        }
    });

    return list;
})(from);
阿神

newArr = arr1.concat(arr2)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号