You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 })

具体步骤:

  1. 遍历数组中的每个元素,从原title中提取纯类型字符串(去掉数字和首尾空格)
  2. 检查累加器中的计数对象,若当前类型不存在则初始化为1,否则计数+1
  3. 用「类型+新计数」生成新的title,存入映射对象
  4. 最终从累加器中取出映射对象即可

完整实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:37