2016-07-14 5 views
3

以下のスクリプトを作成して、配列から重複する文字列を削除しました。しかし、ng-repeatでそれらを通る角度ループがある場合、配列の順序を保持することが重要です。さらに、残りの要素が同じインデックスを保持するようにします。配列内の重複する文字列を削除する最適な方法

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) 
[0] [0] [1] [2] [3] [4] [5] [4] [5]
+0

あなたの方法は少し速いので、あなたの答えに感謝します。 –

1

ターゲットブラウザはspread operatorをサポートする場合は、コンソールにしてみてください:ブラウザのサポートArray.fromはあなたにも書くことができ

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

場合や:と

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

これはうまくいくはずですが、配列の長さを同じに保つ必要があります。 –

+1

@MaxLynn値を削除しても同じ長さを保つ方法は? – llamerr

+0

あなたはもっと深く質問を読む必要があります。どのようなテキストも必要でないことがわかるように、配列の順序を保つ必要があります。だから、スクリプトで重複を空の文字列に置き換えるのはなぜでしょうか? –

2

Mapを使用できます。これはタイプproveであり、何度も繰り返されるのを防ぐために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

あなたの答えは異なるアイテムと同じ番号と文字列番号を扱います、それはあなたが望むものですか? BTW私はOPの要求を全く受けていませんでした。 –

+0

@mortezaT、多分、わからない:) –

1

受け入れ答えは非常に非効率的です。 reduceとハッシュテーブルまたはマップオブジェクトを使用してパフォーマンスを向上させることができます。ここで私は減少の代わりに地図を好むだろう。しかし、私はニーナ・ショルツのアプローチを地図を倍増させることで推測していると思うが、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);

これは生産任意の長さの配列を持つコード、その後ではなく、ファンクタと一緒に行くだろう場合は、追加の深刻なパフォーマンスの向上を導入して以来、私はしかし、標準の機能でマップ・メソッドを実装します大規模な配列で。

0

(サイズ10K +のように)私は、このスクリプトを使用した:i lodash uniq()は非常に有用だと思う

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

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] 
関連する問題