js数组对象中将相同的数据类型归类
初始数据
[
{
id: 1,
name: IP,
value: 1,
category: 类型1
},
{
id: 2,
name: IP1,
value: 0,
category: 类型1
},
{
id: 3,
name: mac,
value: 4,
category: mac地址
}
]
最终数据
[
{
category: 类型1,
children: [
{
id: 1,
name: IP,
value: 1
},
{
id: 2,
name: IP1,
value: 0
}
]
},
{
category: mac地址,
children: [
{
id: 3,
name: mac,
value: 4
}
]
}
]
转化代码
arrayTransfer(data) {
const resultArr = []
data.forEach(function (el) {
let obj = {
name: el.protocolName,
value: el.protocolValue,
layer: el.protocolLayer,
count: el?.count || 0
}
if ([null, undefined, ].includes(el.protocolCategory) || el.protocolCategory === 其他协议) {
el.protocolCategory = 其他协议
}
for (let i = 0; i < resultArr.length; i++) {
if (resultArr[i].protocolCategory === el.protocolCategory) {
resultArr[i].children.push(obj)
return
}
}
resultArr.push({
protocolCategory: el.protocolCategory,
children: [obj]
})
})
return resultArr
}
js数组列表中,将time的值相同的字段分成一组
如`[{time:1, name: 1 }, {time: 1, name: 2}, {time:3, name:4}]`变为`[{time:1, children: [{time:1, name: 1},{time: 1, name: 2}] }, , {time:3, name:4}]` 实现:
const arr = [{
time: 1, name: 1 }, {
time: 1, name: 2}, {
time:3, name:4}];
const result = Object.values(arr.reduce((acc, cur) => {
const {
time, ...rest} = cur;
if (acc[time]) {
acc[time].children.push(rest);
} else {
acc[time] = {
time, children: [rest]};
}
return acc;
}, {
}));
console.log(result); // [{time: 1, children: [{time: 1, name: 1}, {time: 1, name: 2}]}, {time: 3, children: [{time: 3, name: 4}]}]
解析:
-
arr.reduce((acc, cur) => {}, {})用于遍历原始数组,并将结果收集到一个对象中,初始值为一个空对象 {}。 const {time, ...rest} = cur利用解构将 time 和其余属性分开。 if (acc[time]) {} else {}判断该 time 值是否存在于结果对象中,如存在则将新元素 rest 添加到已有 time 对应对象的 children 数组中,如不存在则新建一个带有 time 和空的 children 数组的对象,并将该元素 rest 添加到 children 数组中。 Object.values 获取结果对象的所有值,即将结果对象中的所有对象组成的数组。 最后将所有的记录下来的对象转换为最终的目标数组并返回。
