Rumah  >  Artikel  >  hujung hadapan web  >  Ringkasan algoritma tatasusunan yang biasa digunakan dalam kemahiran JavaScript_javascript

Ringkasan algoritma tatasusunan yang biasa digunakan dalam kemahiran JavaScript_javascript

WBOY
WBOYasal
2016-05-16 15:15:49980semak imbas

Luangkan sedikit masa hari ini untuk meringkaskan beberapa algoritma tatasusunan yang biasa digunakan dalam JavaScript, supaya anda boleh menggunakannya dalam temu bual bertulis atau proses pembangunan harian. Beberapa algoritma datang dari Internet dan diringkaskan di sini. Saya akan lampirkan sumber rujukan di akhir artikel Jika bosan melihat algoritma secara langsung, anda boleh membacanya dalam literatur rujukan.

1. Deduplikasi tatasusunan

Kaedah 1:

//利用数组的indexOf方法
function unique (arr) {
 var result = []; 
 for (var i = 0; i < arr.length; i++)
 {
  if (result.indexOf(arr[i]) == -1) result.push(arr[i]);
 }
 return result;
}

Kaedah 2:

//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5]
function unique (arr){
  var hash = {},result = []; 
  for(var i = 0; i < arr.length; i++)
  {
    if (!hash[arr[i]]) 
    {
      hash[arr[i]] = true; 
      result.push(arr[i]); 
    }
  }
  return result;
}

Kaedah 3:

//Bandingkan item bersebelahan selepas diisih, jika ia sama, menyerahlah, jika tidak tambah pada hasil. Masalah yang sama seperti kaedah 2 akan berlaku Jika terdapat situasi seperti 1,1,'1' dalam tatasusunan, penyelesaian masalah akan berlaku

function unique (arr) {
  arr.sort();
  var result=[arr[0]];
  for(var i = 1; i < arr.length; i++){
    if( arr[i] !== arr[i-1]) {
      result.push(arr[i]);
    }
  }
  return result;
}

Kaedah 4:

//最简单但是效率最低的算法,也不会出现方法2和方法3出现的bug
function unique (arr) {
  if(arr.length == 0) return;
  var result = [arr[0]], isRepeate;
  for( var i = 0, j = arr.length; i < j; i++ ){
    isRepeate = false;
    for( var k = 0, h = result.length; k < h; k++){
      if(result[k] === arr[i]){
        isRepeate = true;
        break;
      }
      if(k == h) break;
    }
    if( !isRepeate ) result.push(arr[i]);
  }
  return result;
}

Kaedah 5:

//此方法充分利用了递归和indexOf方法,感谢网友@真爱像深蓝
var unique = function (arr, newArr) {
   var num;

   if (-1 == arr.indexOf(num = arr.shift())) newArr.push(num);

   arr.length && unique(arr, newArr);
}

2. Gangguan susunan tatasusunan

Kaedah 1:

//每次随机抽一个数并移动到新数组中
function shuffle(array) {
  var copy = [],
    n = array.length,
    i;
  // 如果还剩有元素则继续。。。
  while (n) {
    // 随机抽取一个元素
    i = Math.floor(Math.random() * array.length);
    // 如果这个元素之前没有被选中过。。
    if (i in array) {
      copy.push(array[i]);
      delete array[i];
      n--;
    }
  }
  return copy;
};

Kaedah 2:

//跟方法1类似,只不过通过splice来去掉原数组已选项
function shuffle(array) {
  var copy = [],
    n = array.length,
    i;
  // 如果还剩有元素。。
  while (n) {
    // 随机选取一个元素
    i = Math.floor(Math.random() * n--);
    // 移动到新数组中
    copy.push(array.splice(i, 1)[0]);
  }
  return copy;
}

Kaedah 3:

//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推。
function shuffle(array) {

var m = array.length,
  t, i;
// 如果还剩有元素…
while (m) {
  // 随机选取一个元素…
  i = Math.floor(Math.random() * m--);
  // 与当前元素进行交换
  t = array[m];
  array[m] = array[i];
  array[i] = t;
}
return array; }

3. Penghakiman tatasusunan

Kaedah 1:

//自带的isArray方法
var array6 = [];
Array.isArray(array6 );//true

Kaedah 2:

   //利用instanceof运算符
   var array5 = [];
   array5 instanceof Array;//true

Kaedah 3:

   //利用toString的返回值
   function isArray(o) {
     return Object.prototype.toString.call(o) === '[object Array]'; 
   }

4. Cari persilangan tatasusunan

Kaedah 1:

   //利用filter和数组自带的indexOf方法
   array1.filter(function(n) {
   return array2.indexOf(n) != -1 });

5. Kesatuan tatasusunan

Kaedah 1:

   //方法原理:连接两个数组并去重
   function arrayUnique(array) {
     var a = array.concat(array2);
     for(var i=0; i<a.length; ++i) {
       for(var j=i+1; j<a.length; ++j) {
         if(a[i] === a[j])
           a.splice(j--, 1);
       }
     }
     return a;
   };

6. Set perbezaan array

Kaedah 1:

   //利用filter和indexOf方法
   Array.prototype.diff = function(a) {
     return this.filter(function(i) {
      return a.indexOf(i) < 0;
      });
};

Kaedah 1 di atas hanya boleh mencari perbezaan antara satu tatasusunan dan tatasusunan yang lain Contohnya, tatasusunan1.diff(array2) hanya boleh mencari perbezaan antara tatasusunan1 dan tatasusunan2 dua tatasusunan, Untuk mendapatkannya, anda boleh array1.diff(array2).concat(array2.diff(array1)), atau anda boleh menggunakan kaedah 2

Kaedah 2

   var array1 = new Array(55,55,88,6,68,109,55,33,6,2,1);
   var array2 = [55,88,99,69,109,55,33,6,2,1];
   var diffArr = array1.concat(array2);
   
   var diff = diffArr.filter(function(i) {
           return array1.indexOf(i) < 0||array2.indexOf(i) < 0;
       });
   
   console.log( diff );

Ini diringkaskan buat masa ini dan akan ditambah kemudian. Semua orang dialu-alukan untuk menambah Jika anda mempunyai sebarang pertanyaan, sila tinggalkan mesej untuk berbincang dan membuat kemajuan bersama-sama

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn