我试图将计数附加到字符串数组中的重复条目。我有一个像这样的数组,包含重复的条目。
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"];
最好的方法是什么?
答案 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];
}
});
第一遍记录了每个唯一项目的查看次数,并返回与输入数组对应的数组,记录每个项目的当前计数。
第二遍将计数附加到总计数不是一的任何项目。
的工作演示答案 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]);
}
}
祝你好运!