js 怎么将数组重组成新数组

原数据结构:

var res =[
  0:{id: "1", letter: "D", name_cn: "大学名字"}
  1:{id: "2", letter: "A", name_cn: "大学名字"}
  2:{id: "3", letter: "C", name_cn: "大学名字"}
  3:{id: "3", letter: "D", name_cn: "大学名字"}
]

要实现的数据结构:

            schoolList: [
                {
                    letter: 'A',
                    data: [
                        {name_cn:'大学名字'},
                        {name_cn:'大学名字'}
                    ]
                },
                {
                    letter: 'B',
                    data: [
                        {name_cn:'大学名字'}
                        {name_cn:'大学名字'}

                    ]
                },
                {
                    letter: 'C',
                    data: [
                        {name_cn:'大学名字'}
                        {name_cn:'大学名字'}

                    ]
                }
            ]

怎么将res这个数组里面的letter,按照首字母分类。将首字母为一样的全部重新组成新的数组,然后放在schoolList这个数组里面。

阅读 3.3k
4 个回答
        var res =[
            {id: "1", letter: "D", name_cn: "大学名字"},
            {id: "2", letter: "A", name_cn: "大学名字"},
            {id: "3", letter: "C", name_cn: "大学名字"},
            {id: "3", letter: "D", name_cn: "大学名字"}
        ]
        let data = {}
        res.map(val => {
            let dataInfo = { name_cn: val.name_cn }
            if (data[val.letter]) {
                data[val.letter].data.push(dataInfo)
            } else {
                data[val.letter] = {
                    data: [dataInfo]
                }
            }
        })
        let schoolList = [];

        Object.keys(data).map(val => {
            let dataObj = {
                letter: val,
                data: data[val].data
            }
            schoolList.push(dataObj)
        })
var res = [
    {id: "1", letter: "D", name_cn: "大学名字"},
    {id: "2", letter: "A", name_cn: "大学名字"},
    {id: "3", letter: "C", name_cn: "大学名字"},
    {id: "3", letter: "D", name_cn: "大学名字"},
];


var schoolList = res.sort(function (a,b) {
    var nameA = a.letter.toUpperCase();// ignore upper and lowercase
    var nameB = b.letter.toUpperCase(); // ignore upper and lowercase

    if (nameA < nameB) {
        return -1;
    }
    if (nameA > nameB) {
        return 1;
    }
   // names must be equal

    return 0;
});
console.log(schoolList);

var bb=schoolList.reduce((init,current)=>{
    init.push({
        letter:current.letter,
        data:[{name_cn:current.name_cn}]
    });
    return init;
},[]);
console.log(bb);

clipboard.png

暂时想到这种稍微复杂点的方法

var res =[
  {id: "1", letter: "D", name_cn: "大学名字5"},
  {id: "2", letter: "A", name_cn: "大学名字4"},
  {id: "4", letter: "C", name_cn: "大学名字3"},
  {id: "5", letter: "D", name_cn: "大学名字2"},
  {id: "6", letter: "C", name_cn: "大学名字1"},
  {id: "7", letter: "D", name_cn: "大学名字0"}
]

var op = [];
var middle = '';
for (var i = 0; i < res.length; i++) {
    var value = res[i]['letter'];
    if (middle.includes(value )) {
        var index = middle.indexOf(value);
        op[index]['data'].push(res[i]['name_cn']);
    } else {
        middle+=value;
        var a = { letter: value, data: [res[i]['name_cn']] };
        op.push(a);
    }
}
var res =[
  {id: "1", letter: "D", name_cn: "大学名字1"},
  {id: "2", letter: "A", name_cn: "大学名字2"},
  {id: "3", letter: "C", name_cn: "大学名字3"},
  {id: "3", letter: "D", name_cn: "大学名字4"},
]
var schoolList = [];
res.forEach(function(val,index){
  var letter = val.letter;
  var d = new Object();
  d.name_cn = val.name_cn;
  if(schoolList.filter(obj => obj.letter == letter).length > 0){
    schoolList.filter(obj => obj.letter == letter)[0].data.push(d);
  }else{
    var obj = {letter:letter,data:[d]};
    schoolList.push(obj);
  }
})
console.log(schoolList);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题