【问题标题】:Appending the count to duplicates in a javascript string array将计数附加到 javascript 字符串数组中的重复项
【发布时间】:2012-01-10 04:15:24
【问题描述】:

我正在尝试将计数附加到字符串数组中的重复条目。我有一个这样的数组,其中包含重复的条目。

var myarray = ["John", "John", "John", "Doe", "Doe", "Smith", 
               "John", "Doe", "Joe"];

我想要的输出是

var newArray = ["John - 1", "John - 2", "John - 3", "Doe - 1", 
                "Doe - 2", "Smith", "John - 4", "Doe - 3", "Joe"];

最好的方法是什么?

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    这行得通,使用两次Array.map():

    var map = {};
    var count = myarray.map(function(val) {
        return map[val] = (typeof map[val] === "undefined") ? 1 : map[val] + 1;
    });
    
    var newArray = myarray.map(function(val, index) {
        if (map[val] === 1) {
            return val;
        } else {
            return val + ' - ' + count[index];
        }
    });
    

    第一遍记录每个唯一项目被看到的次数,并返回一个与输入数组对应的数组,记录每个项目的当前计数。

    第二遍将计数附加到总计数不为 1 的任何项目。

    http://jsfiddle.net/alnitak/Z4dgr/ 的工作演示

    【讨论】:

    • Elegant,但请注意,他只想更改 duplicate 条目。所以你可能需要通过两次。
    【解决方案2】:

    类似

    var counts = {}, newArray = [];
    
    // first pass, assign the counts
    for (var i = 0; i < myArray.length; i++) {
       var name = myArray[i],
           count = counts.name;
    
       if (!count) {
          count = 1;
       } else {
          count++;
       }
    
       counts[name] = count;
    
       name = name + " - " + count;
       newArray.push(name);
    }
    
    // Undo changes made for names that only occur once
    for (var i = 0; i < myArray.length; i++) {
       var name = myArray[i],
           count = counts.name;
    
       if (count === 1) {
          newArray[i] = name;
       }
    
    }
    

    请注意,我使用非常简单的 javascript 来使解决方案易于阅读和理解。请注意,您必须两次传递数组。对于非常大的列表,这不是很有效。

    我没有对此进行测试,但类似的东西应该可以工作。

    【讨论】:

      【解决方案3】:

      这应该告诉你所有重复的计数:

      var myarray = ["John", "John", "John", "Doe", "Doe", "Smith", 
                 "John", "Doe", "Joe"];
      var values = {}, newArray = [];
      for (var i = 0; i < myarray.length; i++) {
          if (typeof values[myarray[i]] === 'undefined') {
              values[myarray[i]] = 1;
          } else {
              values[myarray[i]] += 1;
          }
      }
      for (var i = 0; i < myarray.length; i++) {
          if (values[myarray[i]] > 1) {
              newArray.push(myarray[i] + ' - ' + values[myarray[i]]);
          } else {
              newArray.push(myarray[i]);
          }
      }
      

      最好的问候!

      【讨论】:

      • 他想追加运行次数,而不是总次数。
      • 是的,没注意到。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2023-01-19
      • 1970-01-01
      相关资源
      最近更新 更多