2016-07-14 141 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] 
相關問題