将数组中的字符串强制为唯一值而不更改顺序

时间:2016-03-16 18:30:37

标签: javascript arrays

我有一个包含我无法控制的字符串值的小列表。它们都可以是独一无二的,无论如何都是如此。 我需要它们是唯一的,我必须保留顺序,所以我将为每个副本添加一个数字后缀,如下所示:

  • 输入: [ '相同', '相同', '相同,' DIFF”, '另一种', '另一种', '另一']
  • 输出: ['same-1','same-2','same-3','diff','another-1,'another-2','another-3']

我看了map / reduce,似乎是关于删除重复项。我的数组最多只有16个值,但谁知道呢?也许我会用更长的阵列来解决这个问题。

3 个答案:

答案 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>');