[js]ES 3からES 6までどのように配列して重さを取るか教えます.

2914 ワード

宣言
以下の方法は、数組の値が全てprmitive data typeの場合にのみ有効です.
ES 6
方法1:Setデータ構造+Aray.from静的方法
ES 6にSetデータ構造が追加されました.配列と似ていますが、そのメンバーはすべて唯一で、その構造関数はパラメータとして配列を受け入れられます.
 let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3];
 let set = new Set(array);
 let deduped = Array.from(set);// `deduped = de + dup(duplication) + ed`
 console.log(deduped);
 // [1, 2, 3, 4, 5]
方法2:Setデータ構造+拡張文法(spread sysntax)
let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3];
let deduped = [...new Set(array)];
console.log(deduped);
 // [1, 2, 3, 4, 5]
拡張文法はすべてのオブジェクトを巡回するのに有効です.
let obj = {'key1': 'value1'};
let array = [...obj]; 
// TypeError: obj is not iterable
方法3:矢印関数+s 5文法(filter,indexOf)
let array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3];
let deduped = array.filter((el,i,arr) => arr.indexOf(el) === i);
console.log(deduped);
 // [1, 2, 3, 4, 5]
ES 5
var array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3];
var deduped = array.filter(function(el,i,arr) {
    return arr.indexOf(el) === i;
})
console.log(deduped);
 // [1, 2, 3, 4, 5]
ltES 5
var array = [1, 1, 1, 1, 2, 3, 4, 4, 5, 3,[1,2],[3,4]];
var deduped = [];
for(var i=0, l=array.length;i
知識補充——indexOfについて
ブラウザの互換性について
IE 6-8では、配列のindexOf方法はまだ存在しない.ですから、もし互換性のあるIE 6-8が必要なら、自分で輪を作らなければなりません.
var indexOf = [].indexOf ?
    function(arr, item) {
      return arr.indexOf(item)
    } :
    function indexOf(arr, item) {
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] === item) {
          return i
        }
      }
      return -1
    }
性能について——時間の複雑さ
setデータ構造を利用するのがカンニングの方式だというなら、indexOfを使うのは相対的に性能が低い方式です.indexOfの下の階も一回巡回しますから.ネストループは、性能の極致を追求する人に不快感を与えます.
①arrはpushを経て新しい配列②の中で配列のindexOfを1サイクルごとに呼び出す方法であり、また巡回しているので、2回のループの入れ子に相当し、複雑度はO(n 2)となります.
この場合、性能を追求するために、より良い実現方法は、オブジェクトkeyを利用した一意の処理である.まず、配列をオブジェクトに変換し、次に対象を無重量の配列に変換します.たとえば:
var songs = [
         {name:"  C",artist:"  "},
         {name:"  C",artist:"  "},
         {name:"   ",artist:"  "},
         {name:"   ",artist:"  "},
         {artist:"  ",name:"   "}
     ];

function unique(songs){
  let result = {};
  let finalResult=[];
  //        ,    key      
  songs.forEach(function(song, i){
    result[song.name]=song;
  })
  //             
  Object.keys(result).forEach(function(key, i){
    finalResult.push(result[key]);
  })
  
  return finalResult;
}

console.log(unique(songs));

//   :     forEach      for      。
//   :https://github.com/jawil/blog/issues/2
2017-11-16更新します.これは実際には少なくとも二回のサイクルを使っています.一番簡単な配列が重いので、一回りだけでいいです.
もっと複雑なケースは筆者の書いたこのデモを見ることができます.
参考資料
https://github.com/lifesinger/blog/issues/113