JavaScript中基于类型重新计数对象数组字符串序号的问题
字符串序号重新计数问题解决思路
需求说明
需要对对象数组中title的序号按类型重新连续计数:同类型的title序号必须是连续的自然数,无论原序号是什么,也不管中间删除了哪个位置的元素。例如删除Oranges 2后,剩余的Oranges 3、Oranges 4、Oranges 5要依次变为Oranges 2、Oranges 3、Oranges 4。
现有代码问题
你当前的reduce实现存在两处关键错误:
- 使用了未定义的
label变量,无法正确提取类型 - 试图用数组
titlesWithNoDigits存储类型计数,这是错误用法,数组不能通过类型字符串作为键维护计数
正确实现思路
用reduce处理时,累加器需要同时维护两个状态:
- 最终的
id到新title的映射对象 - 每个类型的当前计数(临时对象,比如
{ Oranges: 1, Apples: 1 })
具体步骤:
- 遍历数组中的每个元素,从原
title中提取纯类型字符串(去掉数字和首尾空格) - 检查累加器中的计数对象,若当前类型不存在则初始化为1,否则计数+1
- 用「类型+新计数」生成新的
title,存入映射对象 - 最终从累加器中取出映射对象即可
完整实现代码
const req = [ {id: 'z1', title:"Oranges 1"}, {id: 'y1', title:"Apples 1"}, // Oranges 2 deleted {id: 'a1', title: "Oranges 3"}, {id: 'b1', title: "Apples 2"}, // Apples 3 deleted {id: 'a3', title: "Apples 4"}, {id: 'b2', title: "Oranges 4"}, {id: 'b6', title: "Apples 5"}, {id: 'c3', title: "Oranges 5"}, {id: 'x1', title: "Apples 6"}, ]; const res = req.reduce((acc, item) => { // 提取纯类型字符串:移除所有数字后去除首尾空格 const type = item.title.replace(/[0-9]/g, '').trim(); // 更新当前类型的计数:不存在则初始为1,否则自增1 acc.counts[type] = (acc.counts[type] || 0) + 1; // 生成新title并存入结果映射 acc.result[item.id] = `${type} ${acc.counts[type]}`; return acc; }, { // 初始化累加器:counts存类型计数,result存最终id-title映射 counts: {}, result: {} }).result; console.log(res);
运行结果
{ z1: 'Oranges 1', y1: 'Apples 1', a1: 'Oranges 2', b1: 'Apples 2', a3: 'Apples 3', b2: 'Oranges 3', b6: 'Apples 4', c3: 'Oranges 4', x1: 'Apples 5' }
内容的提问来源于stack exchange,提问作者Owais
相关产品推荐
相关产品推荐

