2016-07-14 139 views
3

我们已经成功创建了下面的脚本以从数组中删除任何重复的字符串。但是,重要的是我们要保持数组的顺序,以便在ng重复时角度循环。另外,我们希望其余的元素保持相同的索引。删除数组中重复字符串的最佳方法

scope.feedback = _.map(_.pluck(item.possibleAnswers, 'feedback'), function (element, index, collection) { 
    return collection.slice(0, index).indexOf(element) === -1 ? element : ''; 
}); 

上面的代码工作,但我们觉得我们的问题必须有比这更简单的解决方案。有没有其他人有类似的问题,并提出一个更好的解决方案?

+0

怎么样使用为同样的目的而减少?这里是数字而不是字符串的小提琴,但我不认为它应该很重要https://jsfiddle.net/58z7nrfy/ – llamerr

+0

你正在寻找字符串或任何数组的数组?你可以添加一些用例或任何关于你的东西的例子(比如之前和之后)。 –

回答

3

变与降低https://jsfiddle.net/58z7nrfy/1/

var a = [1,2,3,1,2,3,2,2,3,4,5,5,12,1,23,4,1]; 

var b = a.reduce(function(p,c,i,a){ 
    if (p.indexOf(c) == -1) p.push(c); 
    else p.push('') 
    return p; 
}, []) 
console.log(b) 

[1,2,3,“”,“”,“”,“”,“”,“”,4,5,“”,12,“”,23,“”,“”]

+0

你的方式是稍快,所以谢谢你的答案。 –

1

如果目标浏览器支持spread operator然后尝试在你的控制台:

[...new Set(['3','1','1','5'])] 
// ['3','1','5'] 

或者,如果浏览器支持Array.from,你也可以这样写:

Array.from(new Set(['3','1','1','5'])) 
// ['3','1','5'] 
+0

所以这将工作,但我需要保持阵列的长度相同。 –

+1

@MaxLynn如果您从中删除了值,如何保持相同的长度? – llamerr

+0

你需要更深入地阅读这个问题。我们需要保持数组的顺序,以便我们知道哪些不需要任何文本。这就是为什么在脚本中,我们用空字符串替换重复的文件 –

2

您可以使用Map,这是类型证明,并防止反复迭代Array#indexOf

var a = [1, 2, 3, 1, 2, 3, 2, 2, 3, 4, 5, 5, 12, 1, 23, 4, 1, '23'], 
 
    filtered = a.filter(function (a) { 
 
     if (!this.has(a)) { 
 
      this.set(a, true); 
 
      return true; 
 
     } 
 
    }, new Map); 
 

 
console.log(filtered);

+0

你的答案处理与不同项目相同的号码和字符串号码,这是你想要的吗?顺便说一句,我没有得到OP的请求。 –

+0

@mortezaT,也许,我不知道:) –

1

接受的答案是非常低效的。人们可以使用reduce和散列表或地图对象来提高性能。尽管如此,我宁愿在减少的地方使用地图。然而,我想通过将地图翻倍来扩展@Nina Scholz的方法,OP的问题的正确答案如下:

var a = [1, 2, 3, 1, 2, 3, 2, 2, 3, 4, 5, 5, 12, 1, 23, 4, 1, '23'], 
 
unified = a.map(function(e) { 
 
        return this.has(e) ? void 0 : (this.set(e,"Cheap Thrills"),e); 
 
       }, new Map()); 
 
console.log(unified);

如果这将是一个生产代码用任意长度的数组然后而非与函子去,我会虽然,因为其引入了一个附加的严重的性能提升实现与标准功能的地图方法在大阵列中。 (如在大小10K +)

0

我用这个脚本:

var words = ['one', 'one', 'two', 'three', 'three', 'two']; 
    var result = []; 
    for(i=0;i<words.length;i++){ 
     if(result.indexOf(words[i]) == -1){ 
     result.push(words[i]) 
     } 
    } 
0

我觉得lodash uniq()是非常有帮助的

let data = [1,2,3,1,2,3,2,2,3,4,5,5,12,1,23,4,1]; 
let uniqData = _.uniq(data ,(e) => { 
return e; 
}); 

然后输出将是:

[1, 2, 3, 4, 5, 12, 23] 
相关问题