我有下面的形式的数组
[{ id: 1, name: 1, port: 1, unit: 2}, { id: 2, name: 2, port: 3, unit: 4}]
我想根据id和name对其进行分组,得到下面形式的数组,代码要如何编写?
[{ id: 1, name: 1, ports: [ { port: 1, unit: 2 } ]},{ id: 2, name: 2, ports: [ { port: 3, unit: 4 } ]}]
如果对数据处理不熟悉,可以直接使用 Lodash,提供了 groupBy
函数用于分组。
分组的时候需要找到每个对象对应的关键字(分组依据),如果 id
和 name
是一一对应关系,只需要按 id
或者 name
分组即可
_.groupBy(list, it => it.id);
如果 id
和 name
不是一一对应,而是存在组合,比如存在 { id: 1, name: 1}
和 { id: 1, name: 2 }
、{ id: 2, name: 1}
等情况,那需要把 id
和 name
组成一个 KEY 来分组,比如
_.groupBy(list, it => `${it.id}|${it.name}`);
完整的程序如下
const result = _(list) .groupBy(it => `${it.id}|${it.name}`) .values() .map(its => ({ id: its[0].id, name: its[0].name, ports: its.map(({ port, unit }) => ({ port, unit })) })) .value();console.log(result);
如果自己写分组,可以在分组的同时处理数据,
const result = Object.values( list.reduce((group, { id, name, ...portInfo }) => { const key = `${id}|${name}`; (group[key] ??= { id, name, ports: [] }).ports.push(portInfo); return group; }, {}));console.dir(result, { depth: null });
好像回答过不少关于分组的问题,随便搜就搜出来一堆,给几个参考
var data = [ { id: 1, name: 1, port: 1, unit: 2 }, { id: 2, name: 2, port: 3, unit: 4 }];var groupedData = data.reduce((accumulator, current) => { // 查找是否已经存在相同的分组 var existingGroup = accumulator.find(group => group.id === current.id && group.name === current.name); if (existingGroup) { // 如果已存在相同的分组,则将当前对象的 'port' 和 'unit' 添加到该分组的 'ports' 数组中 existingGroup.ports.push({ port: current.port, unit: current.unit }); } else { // 如果不存在相同的分组,则创建一个新的分组对象,并初始化 'ports' 数组 accumulator.push({ id: current.id, name: current.name, ports: [{ port: current.port, unit: current.unit }] }); } return accumulator;}, []);console.log(groupedData);
1.用 reduce 方法:
let arr = [{ id: 1, name: 1, port: 1, unit: 2}, { id: 2, name: 2, port: 3, unit: 4}]let res = arr.reduce((acc, cur) => { let found = acc.find(item => item.id === cur.id && item.name === cur.name); if (found) { found.ports.push({port: cur.port, unit: cur.unit}); } else { acc.push({ id: cur.id, name: cur.name, ports: [{port: cur.port, unit: cur.unit}] }); } return acc;}, []);console.log(res);
2.用 Map 对象:
let arr = [{ id: 1, name: 1, port: 1, unit: 2}, { id: 2, name: 2, port: 3, unit: 4}]let map = new Map();arr.forEach(item => { let key = `${item.id}-${item.name}`; let value = map.get(key); if (value) { value.ports.push({port: item.port, unit: item.unit}); } else { map.set(key, { id: item.id, name: item.name, ports: [{port: item.port, unit: item.unit}] }); }});let res = Array.from(map.values());console.log(res);
let arr = [{ id: 1, name: 1, port: 1, unit: 2}, { id: 2, name: 2, port: 3, unit: 4}]let res = [], obj = {}arr.forEach(item => { let key = item.id + '-' + item.name let target = {port: item.port, unit: item.unit} if(!obj[key]){ res.push(obj[key] = { id: item.id, name: item.name, ports: [target] }) }else{ obj[key].ports.push(target) }})console.log(res)
let tere = arr.map(({ id, name, port, unit }) => ({ id, name, ports: [{ port, unit }],}));
let arr=[ ]; 转换为 let newArr=[ ]
问题内容: 我正在尝试将Java中的Javascript数组转换为Java数组。我正在使用javax.script包。我在这里测试了此示例,但是无法识别类型“ NativeArray” 我如何才能识别NativeArray类型? 问题答案: 按照这个答案,看来最好的选择是编写一个JavaScript转换器函数,该函数使用Rhino的Java绑定功能将本机JavaScript数组转换为Java数组。
问题内容: 我有一个想要转换为纯JavaScript数组的json数组: 这是我的json数组: 如何将其转换为普通的javascript数组,如下所示: 问题答案: 已经是JS对象(不是JSON)。但是,您可以在这里: 编辑:将 元素插入数组中的正确位置。谢谢@RoToRa 也许一开始不创建此类对象会更容易。它是如何创建的?
let data=[ {id:1,width:500,height:1000}, {id:2,width:500,height:1000}, {id:3,width:500,height:500}, {id:4,width:500,height:500}, {id:5,width:500,height:1000}, {id:6,width:500,height:1000}, {id:7,width
问题内容: 我有一个包含几个整数的数组。我已经向数组添加了一些值,但是现在我需要通过jQuery的方法将此数组发送到页面。如何将其转换为JSON对象进行发送? 问题答案: 并致电: 注意: _JSON对象现在是大多数现代Web浏览器(IE 8及更高版本)的一部分。
问题内容: 我如何以这种格式转换PHP数组 到以下格式的Javascript数组? 问题答案: 安全声明: 您不再需要以下内容 如果您没有PHP 5.2,则可以使用以下代码: