【问题标题】:Find Duplicate strings in an array and modify them在数组中查找重复的字符串并修改它们
【发布时间】:2023-03-20 20:10:01
【问题描述】:

我有一大堆字符串,这里是其中的一小部分:

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'
]

请帮我解决这个问题

谢谢

【问题讨论】:

  • 用什么来做这个?
  • 嗯,它更多的是机器学习目的,有很多图像文件但它们没有正确命名,我能够将它提升到我现在拥有的但无法为重复名称添加数字

标签: javascript arrays duplicates


【解决方案1】:

您可以为所见值获取一个对象并存储计数器。

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

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

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_'],
    result = x.map(
        (seen => v => v + (seen[v] = v in seen ? seen[v] + 1 : 0))
        ({})
    );

console.log(result);

【讨论】:

    【解决方案2】:

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

    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_'].sort();
    let newStrArray = x.reduce((accumulator, currentVal, index) => {
      // for the first element of the array no changes need to be done
      if (index === 0) {
        accumulator.push(`${currentVal}${index}`);
      } else {
        // check if the current element is same as the previous element from
        // the main array
        const prevVal = x[index - 1];
        if (prevVal === currentVal) {
          // if same then get the previous element from accumulator array
          const getPrevVal = accumulator[index - 1];
          // get the last character , convert to number and increase it by 1
          const num = parseInt(getPrevVal.charAt(getPrevVal.length - 1), 10) + 1;
          // push value to accumulator array
          accumulator.push(`${currentVal}${num}`)
        } else {
          // if previous and current element are not same then 
          // push current element in accumulator array
          accumulator.push(`${currentVal}0`)
        }
      }
    
    
      return accumulator;
    }, []);
    console.log(newStrArray)

    【讨论】:

      【解决方案3】:

      您可以像这样使用递归函数和.map()

      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_']
      
      x = x.map((c, i, a) =>
        a.indexOf(c) === i ? c + '0' : f(a.indexOf(c), c, i, a.slice(1), 1)
      );
      
      function f(ac, c, i, a, s) {
        return a.indexOf(c) === i - s ? c + (s - ac) : f(ac, c, i, a.slice(1), s + 1);
      }
      
      console.log(x);

      【讨论】:

        【解决方案4】:
        found = {}
        x.forEach( (val, i) => {
            found[val] = (found[val]||0) +1;
            x[i] += found[val]-1;
        })
        

        如果你不介意从 1 开始,可以去掉最后一个 -1

        【讨论】:

          猜你喜欢
          • 2023-02-23
          • 2015-06-12
          • 2019-07-23
          • 2014-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          相关资源
          最近更新 更多