Javascript 在数组中查找重复字符串并修改它们

Javascript 在数组中查找重复字符串并修改它们,javascript,arrays,duplicates,Javascript,Arrays,Duplicates,我有一个巨大的字符串数组,这里是它的一小部分: let x = [ 'FireDisaster_03_', 'FireDisaster_03_', 'FireDisaster_03_', 'FireDisaster_05_', 'FireDisaster_05_', 'FireDisaster_07_', 'FireDisaster_07_', 'FireDisaster_07_', 'FireDisaster_07_', 'FireDi

我有一个巨大的字符串数组,这里是它的一小部分:

let x = [
  'FireDisaster_03_', 
  'FireDisaster_03_', 
  'FireDisaster_03_', 
  'FireDisaster_05_', 
  'FireDisaster_05_', 
  'FireDisaster_07_', 
  'FireDisaster_07_', 
  'FireDisaster_07_', 
  'FireDisaster_07_', 
  'FireDisaster_08_', 
  'FireDisaster_08_', 
  'FireDisaster_08_'
] 
我需要为每个重复的字符串添加序列号。这样,结果将如下所示:

[
  'FireDisaster_03_0', 
  'FireDisaster_03_1',  
  'FireDisaster_03_2', 
  'FireDisaster_05_0', 
  'FireDisaster_05_1', 
  'FireDisaster_07_0', 
  'FireDisaster_07_1', 
  'FireDisaster_07_2', 
  'FireDisaster_07_3', 
  'FireDisaster_08_0', 
  'FireDisaster_08_1', 
  'FireDisaster_08_2'
]
请帮我解决这个问题


谢谢你

你可以拿一个物体作为所看到的值并存储计数器

这种方法使用带有IIFE()的
seen
上的闭包和一个检查键是否存在于对象中的表达式

在第一种情况下,它从属性中获取值并添加一个值;在第二种情况下,它将零作为赋值给属性的值,同时该值用于与字符串连接

设x=['firefaster\u 03\u'、'firefaster\u 03\u'、'firefaster\u 03\u'、'firefaster\u 05\u'、'firefaster\u 07\u'、'firefaster\u 07\u'、'firefaster\u 08\u'、'firefaster\u 08\u'],
结果=x.map(
(见=>v=>v+(见[v]=v见?见[v]+1:0))
({})
);

控制台日志(结果)
您可以像这样使用递归函数和
.map()

设x=['firefaster\u 03\u'、'firefaster\u 03\u'、'firefaster\u 03\u'、'firefaster\u 05\u'、'firefaster\u 07\u'、'firefaster\u 07\u'、'firefaster\u 08\u'、'firefaster\u 08\u']
x=x.map((c,i,a)=>
a、 indexOf(c)==i?c+'0':f(a.indexOf(c),c,i,a.slice(1),1)
);
函数f(ac、c、i、a、s){
返回a.indexOf(c)==i-s?c+(s-ac):f(ac,c,i,a.slice(1),s+1);
}
控制台日志(x)

如果您不介意从1开始,可以删除last-1

您可以使用
reduce
。还可以在操作之前对数组进行排序,以便仅与上一个元素进行比较

设x=['firefaster\u 03'、'firefaster\u 03'、'firefaster\u 03'、'firefaster\u 05'、'firefaster\u 07'、'firefaster\u 07'、'firefaster\u 07'、'firefaster\u 08'、'firefaster\u 08']排序();
让newStrArray=x.reduce((累加器、当前值、索引)=>{
//对于数组的第一个元素,无需进行任何更改
如果(索引==0){
push(`${currentVal}${index}`);
}否则{
//检查当前元素是否与中的上一个元素相同
//主阵列
常数prevVal=x[索引-1];
如果(prevVal==currentVal){
//如果相同,则从累加器数组中获取上一个元素
const getPrevVal=累加器[索引-1];
//获取最后一个字符,转换为数字并将其增加1
constnum=parseInt(getPrevVal.charAt(getPrevVal.length-1),10)+1;
//将值推送到累加器数组
accumulator.push(`${currentVal}${num}`)
}否则{
//如果上一个元素和当前元素不相同,则
//累加器阵列中的推流元件
acculator.push(`${currentVal}0`)
}
}
回流蓄能器;
}, []);

console.log(newStrArray)
你用什么来做这件事呢?好吧,这更像是机器学习的目的,有很多图像文件,但它们的名称不正确,我可以把它恢复到现在的状态,但无法为重复的名称添加一个数字
found = {}
x.forEach( (val, i) => {
    found[val] = (found[val]||0) +1;
    x[i] += found[val]-1;
})