[js]ES 3からES 6までどのように配列して重さを取るか教えます.
2914 ワード
宣言
以下の方法は、数組の値が全てprmitive data typeの場合にのみ有効です.
ES 6
方法1:Setデータ構造+Aray.from静的方法
ES 6にSetデータ構造が追加されました.配列と似ていますが、そのメンバーはすべて唯一で、その構造関数はパラメータとして配列を受け入れられます.
ブラウザの互換性について
IE 6-8では、配列のindexOf方法はまだ存在しない.ですから、もし互換性のあるIE 6-8が必要なら、自分で輪を作らなければなりません.
setデータ構造を利用するのがカンニングの方式だというなら、indexOfを使うのは相対的に性能が低い方式です.indexOfの下の階も一回巡回しますから.ネストループは、性能の極致を追求する人に不快感を与えます.
①arrはpushを経て新しい配列②の中で配列のindexOfを1サイクルごとに呼び出す方法であり、また巡回しているので、2回のループの入れ子に相当し、複雑度はO(n 2)となります.
この場合、性能を追求するために、より良い実現方法は、オブジェクトkeyを利用した一意の処理である.まず、配列をオブジェクトに変換し、次に対象を無重量の配列に変換します.たとえば:
もっと複雑なケースは筆者の書いたこのデモを見ることができます.
参考資料
https://github.com/lifesinger/blog/issues/113
以下の方法は、数組の値が全て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 5var 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 5var 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