JavaScript中按姓氏与年龄分组生成连续order字段的实现
实现JavaScript数组按规则添加order字段
需求说明
需要将给定的JavaScript数组转换为包含order字段的新数组,规则如下:
- 当元素的
surname(姓氏)和age(年龄)同时相同时,共享同一个order值,不递增计数 - 其余元素按顺序递增
order数值
原始数组
[ {name:"jhon",surname:"connor",age:21}, {name:"jhonny",surname:"lator",age:22}, {name:"celia",surname:"mcgregor",age:23}, {name:"raul",surname:"fernandez",age:25}, {name:"marcela",surname:"fernandez",age:25}, {name:"omar",surname:"caster",age:26}, {name:"luna",surname:"potter",age:30}, {name:"harry",surname:"potter",age:30}, ]
目标数组
[ {order:1,name:"jhon",surname:"connor",age:21}, {order:2,name:"jhonny",surname:"lator",age:22}, {order:3,name:"celia",surname:"mcgregor",age:23}, {order:4,name:"raul",surname:"fernandez",age:25}, {order:4,name:"marcela",surname:"fernandez",age:25}, {order:5,name:"omar",surname:"caster",age:26}, {order:6,name:"luna",surname:"potter",age:30}, {order:6,name:"harry",surname:"potter",age:30}, ]
解决方案代码
const originalArray = [ {name:"jhon",surname:"connor",age:21}, {name:"jhonny",surname:"lator",age:22}, {name:"celia",surname:"mcgregor",age:23}, {name:"raul",surname:"fernandez",age:25}, {name:"marcela",surname:"fernandez",age:25}, {name:"omar",surname:"caster",age:26}, {name:"luna",surname:"potter",age:30}, {name:"harry",surname:"potter",age:30}, ]; const resultArray = originalArray.reduce((acc, current) => { let currentOrder = acc.order; const prevItem = acc.result[acc.result.length - 1]; // 首次遍历或当前元素与上一个元素的姓氏、年龄不同时,递增order if (!prevItem || prevItem.surname !== current.surname || prevItem.age !== current.age) { currentOrder = acc.order + 1; } acc.result.push({ order: currentOrder, ...current }); acc.order = currentOrder; return acc; }, { order: 0, result: [] }).result; console.log(resultArray);
代码逻辑说明
- 使用
Array.reduce()方法遍历数组,通过累加器acc维护两个状态:当前的order计数和结果数组result - 每次遍历元素时,检查是否为第一个元素,或当前元素的
surname和age是否与上一个已处理元素不同 - 满足条件时,将
order计数加1;否则沿用当前的order值 - 将包含
order字段的新元素推入结果数组,更新累加器状态后继续遍历 - 最终从累加器中提取
result字段,得到符合要求的目标数组
内容的提问来源于stack exchange,提问作者juan perez
相关产品推荐
相关产品推荐

