素材牛VIP会员
js数组重组
 10***19  分类:JavaScript  人气:2222  回帖:11  发布于6年前 收藏

现在有一个数组类似于
var a=[{name:"May",age:12,id:1},{name:"Jone",age:13,id:5},{name:"May",age:15,id:6}];
要把所有name相同的对象重组,大概成为这样的数组
var b = [{

name: "May",
list: [{
    name: "May",
    age: 12,
    id: 1
}, {
    name: "May": age: 15,
    id: 6
}]

}, {

name: "Jone",
list: [{
    name: "Jone",
    age: 13,
    id: 5
}]

}]

 标签:es6javascript

讨论这个帖子(11)垃圾回帖将一律封号处理……

Lv4 码徒
25***om UI设计师 6年前#1
var a = [{
  name : "May",
  age : 12,
  id : 1
}, {
  name : "Jone",
  age :13,
  id : 5
}, {
  name : "May",
  age : 15,
  id : 6
}],
aPerson = a.reduce(function(p, n) {
   p.some(function(o) {
   return  o.name === n.name && o.list.push(n);
   }) || p.push({
    name : n.name,
    list : [n]
  });
  return p;
}, []);
alert(JSON.stringify(aPerson));
Lv6 码匠
请***g JAVA开发工程师 6年前#2

如果你用了lodash的话,它有个groupBy的函数,应该复合你的要求
lodash.groupBy

 let group=_.groupBy([],(item)=>item.name))
Lv3 码奴
黑***枯 PHP开发工程师 6年前#3

lodash库的groupBy可以实现
结果需要转换一下

Lv6 码匠
lo***ou 职业无 6年前#4

供参考

Array.from(
  arr.reduce((m, x) => m.set(x.name, [...(m.get(x.name) || []), x]), new Map())
).map(([name, list]) => ({name, list}))
Lv5 码农
zh***ao 职业无 6年前#5
const users = [{ name : "May", age : 12, id : 1 }, { name : "Jone", age :13, id : 5 }, { name : "May", age : 15, id : 6 }];

function distinctUsers(users) {
    return users.reduce((users, user) => {
        if (!users.filter(({ name }) => user.name === name)[0]) {
            users.push(user);
        }
        
        return users;
    }, []);
}

distinctUsers(users);
// => [{"name":"May","age":12,"id":1},{"name":"Jone","age":13,"id":5}]
Lv4 码徒
sk***e4 页面重构设计 6年前#6

分组第一时间想到的就是利用对象。。。

var a = [{ name: "May", age: 12, id: 1 }, { name: "Jone", age: 13, id: 5 }, { name: "May", age: 15, id: 6 }];

let obj = {};
let result = [];
a.forEach( (element, index) => {
    if (!obj[element.name]) {
        obj[element.name] = [];
    }
    obj[element.name].push(element);
});

for (let key in obj) {
    result.push({
        name: key,
        list: obj[key]
    }); 
}

console.log(result);
Lv2 入门
th***kd 站长 6年前#7

花了20分钟才写出来,感觉自己好菜。

var a=[{name:"May",age:12,id:1},{name:"Jone",age:13,id:5},{name:"May",age:15,id:6}];
var b = [];
for(let index_a in a){
    //console.log(a[index_a]);
    if(index_a == 0){
        b.push({
            name:a[index_a].name,
            list:[a[index_a]]
        });
    }
    for(let index_b in b){
        if(b[index_b].name == a[index_a].name && index_a>0){
            b[index_b].list.push(a[index_a]);
        }else{
            var boo = false;
            for(let index_c in b){
                if(b[index_c].name==a[index_a].name){
                     boo = true;
                }
            }
            if(!boo){
                b.push({
                    name:a[index_a].name,
                    list:[]
                });
            }
            
        }
    }
};
console.log(b);
Lv1 新人
qq***qq JS工程师 6年前#8

有必要非要前端来操作这数据格式转化?
可以是可以,只是js不太适合。
一般后端给的数据不符合前端的,那么后端有义务要改,如果有中间层bff的话,这种事应该让他们处理。
前端的工作职责是接收数据=>展示数据
工作内容分清楚,后期才不会留太多坑

Lv5 码农
野***7 CEO 6年前#9
const a = [{ name: "May", age: 12, id: 1 }, { name: "Jone", age: 13, id: 5 }, { name: "May", age: 15, id: 6 }]

let result = Object.values(a.reduce((m, n) => {
    if (!m[n.name]) {
        m[n.name] = {name: n.name, list: []}
    }
    m[n.name].list.push(n)
    return m
}, {}))

console.log(result)
Lv6 码匠
蜜***园 Web前端工程师 6年前#10

可以参考这个
https://segmentfault.com/a/11...

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取