将计数附加到javascript字符串数组中的重复项

时间:2012-01-09 19:42:44

标签: javascript arrays

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

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"];

最好的方法是什么?

3 个答案:

答案 0 :(得分:5)

这可行,使用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];
    }
});

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

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

http://jsfiddle.net/alnitak/Z4dgr/

的工作演示

答案 1 :(得分:4)

类似

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来使解决方案易于阅读,易懂。请注意,您必须两次传递数组。对于非常大的列表,这不是很有效。

我没有对此进行测试,但是这样的事情应该可行。

答案 2 :(得分:0)

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

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

祝你好运!