js将一个数组对象中包含两个相同的key属性,整理成为一个新的数组
问题描述:
const list = [
{
no:'202012300001',
exno:'yt',
name:'订单1'
},
{
no:'202012300001',
exno:'yt',
name:'订单2'
},
{
no:'202012300002',
exno:'yt',
name:'订单3'
},
{
no:'202012300002',
exno:'yt',
name:'订单4'
}
];
//需要整理成为
const list = [
{
name:'yt',
no:'202012300001',
list:[
{
name:'订单1'
},
{
name:'订单2'
}
],
},
{
name:'yt',
no:'202012300002',
list:[
{
name:'订单4'
},
{
name:'订单3'
}
],
}
];
这要怎么处理呢?求大神指点
答
arr = [
{
no: '202012300001',
exno: 'yt',
name: '订单1'
},
{
no: '202012300001',
exno: 'yt',
name: '订单2'
},
{
no: '202012300002',
exno: 'yt',
name: '订单3'
},
{
no: '202012300002',
exno: 'yt',
name: '订单4'
}
];
let newArr = []
arr.forEach(({ no, exno }) => {
if (newArr.filter((res) => { return res.no == no && res.exno == exno }).length == 0) {
newArr.push({ no, exno, list: [] })
}
})
newArr.forEach((item) => {
let names = arr.filter((res) => { return res.no == item.no && res.exno == item.exno });
names.forEach((res) => {
item.list.push(res.name)
})
})
console.log(newArr)
答
const reduceList = (ary) => ary.reduce((c, n) => {
c.find(e => e.no === n.no) ? c[c.findIndex(e => e.no === n.no)].list.push({
name: n.name
}) : c.push({
name: n.exno,
no: n.no,
list: [{ name: n.name }]
})
return c
}, [])
答
let tempArr = [];
let endData = [];
for (let i = 0; i < list.length; i++) {
if (tempArr.indexOf(list[i].no) === -1) {
endData.push({
no: list[i].no,
exno:list[i].exno,
list: [list[i].name]
});
tempArr.push(list[i].no);
} else {
for (let j = 0; j < endData.length; j++) {
if (endData[j].no == list[i].no) {
endData[j].list.push(list[i].name);
break;
}
}
}
}
console.log(endData); // 最终输出
答
arr = [
{
no: '202012300001',
exno: 'yt',
name: '订单1'
},
{
no: '202012300001',
exno: 'yt',
name: '订单2'
},
{
no: '202012300002',
exno: 'yt',
name: '订单3'
},
{
no: '202012300002',
exno: 'yt',
name: '订单4'
}
];
let newArr = []
arr.forEach(({ no, exno }) => {
if (newArr.filter((res) => { return res.no == no && res.exno == exno }).length == 0) {
newArr.push({ no, exno, list: [] })
}
})
newArr.forEach((item) => {
let names = arr.filter((res) => { return res.no == item.no && res.exno == item.exno });
names.forEach((res) => {
item.list.push({ name: res.name })
})
item.name = item.exno;
delete item.exno;
})
console.log(newArr)