现有这样一段json,问怎么才能处理成为我想要的格式呢?

现有这样一段json,问怎么才能处理成为我想要的格式呢?

        articleList:[
                {id:1,name:"小红",user:456312,Occupation:"教练"},
                {id:2,name:"小张",user:456321,Occupation:"歌手"},
                {id:3,name:"小强",user:456312,Occupation:"老师"},
                {id:1,name:"小分",user:456312,Occupation:"同事"},
                {id:2,name:"小撒",user:456132,Occupation:"总经理"},
                {id:3,name:"小看",user:456132,Occupation:"程序猿"},
                {id:1,name:"小贫",user:451632,Occupation:"演员"}
            ],
            
            
            

把id相同的放在一个数组里面,用js代码怎么实现呢?大神

        articleList:[
                {
                    id:1,
                    list:[
                            {name:"小红",user:456312,Occupation:"教练"},
                            {name:"小分",user:456312,Occupation:"同事"}.
                            {name:"小贫",user:451632,Occupation:"演员"}
                     ]
                },
                {
                    id:2,
                    list:[
                            {name:"小张",user:456321,Occupation:"歌手"},
                            {name:"小撒",user:456132,Occupation:"总经理"}
                     ]
                },
                {
                    id:,
                    list:[
                            {name:"小强",user:456312,Occupation:"老师"},
                            {name:"小看",user:456132,Occupation:"程序猿"}
                     ]
                }
            ]
阅读 3.4k
6 个回答
/* 你就算把id换成qwer9538都没事 */
let articleList = [/* 省略 */]
let newList = []
let aMap = {}
articleList.forEach(a => {
  if (!(('' + a.id) in aMap)){
    aMap['' + a.id] = newList.length
    newList.push({
      id: a.id,
      list: [{/* 省略 */}]
    })
  } else {
    newList[aMap['' + a.id]].list.push({/* 省略 */})
  }
})

这一段可以实现你说的功能。比较简单,就是按id往数组对应的下标里写东西就好了。

let articleList = [
    { id: 1, name: "小红", user: 456312, Occupation: "教练" },
    { id: 2, name: "小张", user: 456321, Occupation: "歌手" },
    { id: 3, name: "小强", user: 456312, Occupation: "老师" },
    { id: 1, name: "小分", user: 456312, Occupation: "同事" },
    { id: 2, name: "小撒", user: 456132, Occupation: "总经理" },
    { id: 3, name: "小看", user: 456132, Occupation: "程序猿" },
    { id: 1, name: "小贫", user: 451632, Occupation: "演员" }
];

let newObject = [];

//循环
for (let index in articleList) {
    //取对象
    let o = articleList[index];
    //第一次为一个id增加对象
    if (!newObject[o.id]) {
        newObject[o.id] = {
            id: o.id,
            list: []
        }
    }
    //加入进去
    newObject[o.id].list.push({
        name: o.name,
        user: o.user,
        Occupation: o.Occupation
    })
}
//打印结果
console.log(newObject);

以上代码会在数组里产生空值,使用for(let i = 0;i<a.length;i++)遍历会取出undefine。其实使用for in遍历就不会出现这个问题。可以增加代码如下:

    let array = [];
    for (let key in newObject){
      array.push(newObject[key])
    }
    console.log('array',array);

可以看到是可以正常遍历的,即使id是字符串,上述代码也不会有问题,因为数组也可以使用字符串作为下标。

let foldById = data => data.reduce((acc, cur) => {
    let { id, name, user, Occupation } = cur; 
    let toInsert = { name, user, Occupation }; 
    
    if (acc[id]){
        acc[id].list.push(toInsert); 
    } else {
        acc[id] = { id, list: [ toInsert ] }
    }

    return acc; 
}, {});

结果是类数组对象。

test

let data = [
    { id: 1, name: "小红", user: 456312, Occupation: "教练" },
    { id: 2, name: "小张", user: 456321, Occupation: "歌手" },
    { id: 3, name: "小强", user: 456312, Occupation: "老师" },
    { id: 1, name: "小分", user: 456312, Occupation: "同事" },
    { id: 2, name: "小撒", user: 456132, Occupation: "总经理" },
    { id: 3, name: "小看", user: 456132, Occupation: "程序猿" },
    { id: 1, name: "小贫", user: 451632, Occupation: "演员" }
];

foldById(data); 

clipboard.png

新手上路,请多包涵

遍历第一个json,把同一id的放倒一个列表中就好了!

/**
 * var arr = [{name:"aaa",age:50},{name:"bbb",age:3},{name:"ccc",age:3}]
 * groupBy(arr,"age")
 * arr -> [{key:3,list:[{name:"bbb",age:3},{name:"ccc",age:3}]},{key:50,list:[{name:"aaa",age:50}]}]
 * groupBy 按某个key分类(改变原数组)
 * @param {Array} target 目标数组
 * @param {String} keyword 关键字
 * @return {Number} length 改变数组后的长度
 */
function groupBy(target, keyword) {
    var hash = {};
    for (var i = 0, j = 0, l = target.length; i < l; i++) {
        var key = target[i][keyword];
        if (hash[key] === undefined) {
            target[i] = { key: key, list: [target[i]] }
            hash[key] = j++;
        } else {
            target[hash[key]].list.push(target[i]);
        }
    }
    return target.length = j;
}
console.log(groupBy(articleList, "id"), articleList)
let articleList = [
    { id: 1, name: "小红", user: 456312, Occupation: "教练" },
    { id: 2, name: "小张", user: 456321, Occupation: "歌手" },
    { id: 3, name: "小强", user: 456312, Occupation: "老师" },
    { id: 1, name: "小分", user: 456312, Occupation: "同事" },
    { id: 2, name: "小撒", user: 456132, Occupation: "总经理" },
    { id: 3, name: "小看", user: 456132, Occupation: "程序猿" },
    { id: 1, name: "小贫", user: 451632, Occupation: "演员" }
];
let newArticleList = [];
let idArray = [];
articleList.forEach(article => {
    if (idArray.indexOf(article.id) == -1) {
        idArray.push(article.id);
        newArticleList.push({
            id: article.id,
            list: [{
                name: article.name,
                user: article.user,
                Occupation: article.Occupation
            }]
        });
    } else {
        newArticleList.forEach(newArticle => {
            if (newArticle.id == article.id) {
                newArticle.list.push({
                    name: article.name,
                    user: article.user,
                    Occupation: article.Occupation
                });
            }
        });
    }
});
console.log(newArticleList);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题