我们设法创建了下面的脚本,以从数组中删除任何重复的字符串。但是,重要的是我们保持数组的顺序,以便在ng-repeat上角度循环通过它们。此外,我们希望其余元素保持相同的索引。
scope.feedback = _.map(_.pluck(item.possibleAnswers, 'feedback'), function (element, index, collection) {
return collection.slice(0, index).indexOf(element) === -1 ? element : '';
});
上面的代码可行,但我们觉得必须有一个更简单的解决方案来解决我们的问题。还有其他人有类似的问题,并提出更好的解决方案吗?
答案 0 :(得分:5)
Variant with reduce 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,“”,“”]
答案 1 :(得分:2)
如果目标浏览器支持spread operator,请在您的控制台中尝试:
[...new Set(['3','1','1','5'])]
// ['3','1','5']
或者,如果浏览器支持Array.from,您也可以写:
Array.from(new Set(['3','1','1','5']))
// ['3','1','5']
答案 2 :(得分: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);
答案 3 :(得分: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);

如果这是一个具有任意长度数组的生产代码,而不是使用仿函数,我将使用标准函数实现map方法,因为它在大型数组中引入了额外的严重性能提升。 (比如大小10K +)
答案 4 :(得分: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])
}
}
答案 5 :(得分: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]
答案 6 :(得分:0)
除了上述答案外,您还可以使用lodash union这样的功能:
let duplicates = ['Hello', 'Hi', 'Hello'];
let uniques = _.union(duplicates);
独特的将是:[&#34;你好&#34;,&#34;嗨&#34;]