配列をフィルタリングして一意の値を持つようにする [重複] 質問する

配列をフィルタリングして一意の値を持つようにする [重複] 質問する

配列をフィルタリングして一意の値のみを含める必要があります。これが私の配列データです

["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]

期待される結果は

["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8", "X_row9"]

適切な結果を得るには、コードをどのように続行すればよいですか。

newArray = [];
for(n in data){
  if(!newArray.indexOf(n)){
     newArray.push(n);
  }
}
console.log(newArray);

追加情報が必要な場合はお知らせください。提供いたします。ありがとうございます

ベストアンサー1

使用できます配列.フィルターコールバック関数の戻り値に基づいて配列の要素をフィルターする関数。コールバック関数は、元の配列のすべての要素に対して実行されます。

ここでのコールバック関数のロジックは、indexOf現在の項目の値がインデックスと同じである場合、要素が初めて検出されたことを意味し、一意であると見なすことができます。そうでない場合は、要素がすでに検出されたことを意味するため、今すぐ破棄する必要があります。

var arr = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"];

var filteredArray = arr.filter(function(item, pos){
  return arr.indexOf(item)== pos; 
});

console.log( filteredArray );

警告:指摘したように奪うコメントによると、このメソッドは で実行されるため、非常に大きな配列では使用しないでくださいO(N^2)

更新 (2017 年 11 月 16 日)

頼れるならES6の機能、その後はオブジェクトの設定そしてスプレッド演算子下記の @Travis Heeter の回答で既に指定されているように、指定された配列から一意の配列を作成します。

var uniqueArray = [...new Set(array)]

おすすめ記事