我有一个包含我无法控制的字符串值的小列表。它们都可以是独一无二的,无论如何都是如此。 我需要它们是唯一的,我必须保留顺序,所以我将为每个副本添加一个数字后缀,如下所示:
我看了map / reduce,似乎是关于删除重复项。我的数组最多只有16个值,但谁知道呢?也许我会用更长的阵列来解决这个问题。
答案 0 :(得分:1)
这是一个包含Array#map()
和Array#reduce()
以及临时对象this
的解决方案。
var data = ['same', 'same', 'same', 'diff', 'another', 'another', 'another'],
result = data.map(function (a) {
return this[a].c === 1 ? a : a + '-' + ++this[a].i;
}, data.reduce(function (r, a) {
r[a] = r[a] || { c: 0, i: 0 };
r[a].c++;
return r;
}, {}));
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
性能更佳的版本:
var data = ['same', 'same', 'same', 'diff', 'another', 'another', 'another'],
result = function (array) {
var o = {};
array.forEach(function (a) {
o[a] = o[a] || { c: 0, i: 0 };
o[a].c++;
});
return array.map(function (a) {
return o[a].c === 1 ? a : a + '-' + ++o[a].i;
});
}(data);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
单循环解决方案受到Rajaprabhu Aravindasamy's solution
的启发
var data = ['same', 'same', 'same', 'diff', 'another', 'another', 'another'];
data.forEach(function (a, i, aa) {
if (!this[a]) {
this[a] = { i: i, c: 0 };
return;
}
if (!this[a].c) {
aa[this[a].i] += '-' + ++this[a].c;
}
aa[i] += '-' + ++this[a].c;
}, {});
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');
答案 1 :(得分:0)
这是一种简单(但不是很快)的方式:
['same','same','same','diff','another','another','another'].map(function(a,b,c){
if(c.lastIndexOf(a)==b && c.indexOf(a)==b) return a; //only one, return bare
return a+"-"+c.slice(0,b+1).filter(function(x){return a===x; }).length; //dupe, return with remaining dupe count
});
//== ["same-1", "same-2", "same-3", "diff", "another-1", "another-2", "another-3"]
答案 2 :(得分:0)
单循环方法,
var x = ['same', 'same', 'same', 'diff', 'another', 'another', 'another'],dupes = {};
x.forEach(function(itm, i) {
if (!dupes[itm]) {
dupes[itm] = { cnt: 1, index: i };
} else {
if (dupes[itm].index !== undefined) {
x[dupes[itm].index] += "-1";
delete dupes[itm].index;
dupes[itm].cnt += 1;
}
x[i] = x[i] + "-" + dupes[itm].cnt;
dupes[itm].cnt += 1;
}
});
document.write('<pre>' + JSON.stringify(x, 0, 4) + '</pre>');