配列重複排除の JS 実装の例

零下一度
リリース: 2017-07-16 14:52:48
オリジナル
1376 人が閲覧しました

フロントエンドの面接担当者が準備しなければならない質問: Javascript で配列の重複を削除する方法。私の知る限り、Baidu、Tencent、Shanda などはすべてインタビューでこの質問をしています。この質問は単純なように見えますが、実際には隠れた危険が含まれています。このテストでは、この機能を理解するだけでなく、コンピューター プログラムの実行についての深い理解も試されます。

方法1:

スプライスを使用して元の配列を直接操作します

二重層ループ、外側のループ要素、値を比較します

内側のループが同じ値を持つ場合、この値を削除します

注: 要素を削除した後、配列の長さを 1 減らす必要があります。

Array.prototype.distinct = function (){
  var arr = this,
    i,
    j,
    len = arr.length;
  for(i = 0; i < len; i++){
    for(j = i + 1; j < len; j++){
      if(arr[i] == arr[j]){
        arr.splice(j,1);
        len--;
        j--;
      }
    }
  }
  return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
ログイン後にコピー

利点: シンプルで理解しやすい

欠点: メモリ使用量が多く、速度が遅い

方法 2:

二重層ループ、外側のループ要素、内側のループ中に値を比較します

同じ値がある場合はスキップし、同じでない場合は配列にプッシュします

Array.prototype.distinct = function(){
  var arr = this,
    result = [],
    i,
    j,
    len = arr.length;
  for(i = 0; i < len; i++){
    for(j = i + 1; j < len; j++){
      if(arr[i] === arr[j]){
        j = ++i;
      }
    }
    result.push(arr[i]);
  }
  return result;
}
var arra = [1,2,3,4,4,1,1,2,1,1,1];
arra.distinct();       //返回[3,4,2,1]
ログイン後にコピー

方法 3: オブジェクトの 属性を使用して重複を削除する

Array.prototype.distinct = function (){
  var arr = this,
    i,
    obj = {},
    result = [],
    len = arr.length;
  for(i = 0; i< arr.length; i++){
    if(!obj[arr[i]]){  //如果能查找到,证明数组元素重复了
      obj[arr[i]] = 1;
      result.push(arr[i]);
    }
  }
  return result;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
var b = a.distinct();
console.log(b.toString()); //1,2,3,4,5,6,56
ログイン後にコピー

方法 4: 配列再帰重複を削除する

再帰的なアイデアを使用する

最初に並べ替えて、最後から比較する同じものに遭遇した場合は、


Array.prototype.distinct = function (){
  var arr = this,
    len = arr.length;
  arr.sort(function(a,b){    //对数组进行排序才能方便比较
    return a - b;
  })
  function loop(index){
    if(index >= 1){
      if(arr[index] === arr[index-1]){
        arr.splice(index,1);
      }
      loop(index - 1);  //递归loop函数进行去重
    }
  }
  loop(len-1);
  return arr;
};
var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56];
var b = a.distinct();
console.log(b.toString());    //1,2,3,4,5,6,45,56
ログイン後にコピー

メソッド5:indexOfとforEachを使用します


Array.prototype.distinct = function (){
  var arr = this,
    result = [],
    len = arr.length;
  arr.forEach(function(v, i ,arr){    //这里利用map,filter方法也可以实现
    var bool = arr.indexOf(v,i+1);    //从传入参数的下一个索引值开始寻找是否存在重复
    if(bool === -1){
      result.push(v);
    }
  })
  return result;
};
var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
var b = a.distinct();
console.log(b.toString());  //1,23,2,3
ログイン後にコピー

メソッド6:ES6のset

を使用します同様のデータ構造を設定します配列に変換され、そのメンバーの値はすべて一意です。

Array.fromを使用してSet構造体を配列に変換します


function dedupe(array){
  return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]
ログイン後にコピー

Extended

operator(...)は内部でfor...ofループを使用します

let arr = [1,2,3,3];
let resultarr = [...new Set(arr)];  
console.log(resultarr); //[1,2,3]
ログイン後にコピー

以上が配列重複排除の JS 実装の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート