删除数组

时间:2016-07-14 11:46:22

标签: javascript arrays angularjs lodash

我们设法创建了下面的脚本,以从数组中删除任何重复的字符串。但是,重要的是我们保持数组的顺序,以便在ng-repeat上角度循环通过它们。此外,我们希望其余元素保持相同的索引。

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

上面的代码可行,但我们觉得必须有一个更简单的解决方案来解决我们的问题。还有其他人有类似的问题,并提出更好的解决方案吗?

7 个答案:

答案 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;]