配列デリフレクション

7464 ワード

二層サイクルはindexOfを用いてサイクル判定を最初に考えたかもしれないが,この方法の前にvar array=[1,1,'1','1'];function unique(array){//res結果var res=[];for(var i=0、arrayLen=array.length;ivar array = [1, 1, '1']; function unique(array) { var res = []; for (var i = 0, len = array.length; i < len; i++) { var current = array[i]; if (res.indexOf(current) === -1) { res.push(current) } } return res; } console.log(unique(array)); 並べ替え後に並べ替えてみましょう.まず、並べ替える配列をsortメソッドで並べ替えると、同じ値が並べ替えられます.次に、現在の要素が前の要素と同じかどうかを判断するだけで、同じ説明が繰り返され、異なる場合はresに追加されます.demo:var array=[1,1,'1']を書きましょう.function unique(array){var res=[];var sortedArray=array.concat().sort();var seen;for(var i=0,len=sortedArray.length;iunique APIはこの2つの方法を知った後、uniqueというツール関数を書くことを試みることができ、パラメータisSortedに基づいて伝達された配列がソートされているかどうかを判断し、trueであれば隣接要素が同じかどうかを判断し、falseであればindexOfを用いてvar array 1=[1,2,'1',2,1]を判断する.var array2 = [1, 1, '1', 2, 2];//第1版function unique(array,isSorted){var res=[];var seen=[];
for (var i = 0, len = array.length; i < len; i++) {
    var value = array[i];
    if (isSorted) {
        if (!i || seen !== value) {
            res.push(value)
        }
        seen = value;
    }
    else if (res.indexOf(value) === -1) {
        res.push(value);
    }        
}
return res;
} console.log(unique(array1));//[1, 2, "1"] console.log(unique(array2, true));//[1,“1”,2]最適化unqiqueはすでに再機能を試みることができるが、このAPIをより強くするために、新しい需要を考えてみる:アルファベットの大文字と小文字は一致していると見なされ、例えば'a'と'A'は、1つ保留すればよい!すべてのアルファベットを小文字に変換してunique関数に転送するなど、配列内のすべてのデータを処理することができますが、配列を処理するこのループを省いて、直接重いループで行う方法はありませんか?このニーズを達成しましょう:var array 3=[1,1,'a','A',2];
//第2版//iteratee英文解釈:function unique(array,isSorted,iteratee){var res=[];var seen=[];
for (var i = 0, len = array.length; i < len; i++) {
    var value = array[i];
    var computed = iteratee ? iteratee(value, i, array) : value;
    if (isSorted) {
        if (!i || seen !== computed) {
            res.push(value)
        }
        seen = computed;
    }
    else if (iteratee) {
        if (seen.indexOf(computed) === -1) {
            seen.push(computed);
            res.push(value);
        }
    }
    else if (res.indexOf(value) === -1) {
        res.push(value);
    }        
}
return res;
}
console.log(unique(array3, false, function(item){ return typeof item == 'string' ? item.toLowerCase() : item }));//[1,"a",2]この版も最終版の実装であり、関数伝達の3つのパラメータ:array:重さを除去する配列を表し、isSortedを必須とする:関数伝達の配列が順序付けられているかどうかを表し、trueの場合、より速い方法で重さを除去するiteratee:1つの関数を伝達し、各要素を再計算することができる.そして処理の結果に基づいてここまでやり直すと、underscoreの考え方に倣ってunique関数filter ES 5を書くことでfilter法を提供し、indexOfを使用する方法:var array=[1,2,1,1'];function unique(array) { var res = array.filter(function(item, index, array){ return array.indexOf(item) === index; }) return res; } console.log(unique(array)); 並べ替えの方法:
var array = [1, 2, 1, 1, '1']; function unique(array) { return array.concat().sort().filter(function(item, index, array){ return !index || item !== array[index - 1] }) } console.log(unique(array)); Objectキー値対の重さ除去の方法は多く,underscoreに従ってunqiue APIを書いたが,他の方法を見て視野を広げた:この方法は空のObjectオブジェクトを利用して配列の値をObjectのkey値,例えばObject[value 1]=trueとして格納し,別の値を判断する際に,Object[value 2]が存在する場合、この値は重複していることを示します.例示的なコードは、var array=[1,2,1,1,'1'];function unique(array) { var obj = {}; return array.filter(function(item, index, array){ return obj.hasOwnProperty(item) ? false : (obj[item] = true) }) } console.log(unique(array));//[1,2]1と'1'は異なるため、問題があることがわかりますが、この方法は同じ値と判断します.これは、オブジェクトのキー値が文字列でしかないため、typeof item+itemを使用してkey値として文字列をつづり、var array=[1,2,1,1,'1']を避けることができます.function unique(array) { var obj = {}; return array.filter(function(item, index, array){ return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true) }) } console.log(unique(array));//[1,2,"1"]しかしながら、typeof item+itemの結果はobject[object Object Object]になるため、{value:1}と{value:2}の2つのオブジェクトを正確に区別することはできないが、JSONを使用することができる.stringifyオブジェクトをシーケンス化:var array=[{value:1},{value:1},{value:2}];function unique(array) { var obj = {}; return array.filter(function(item, index, array){ console.log(typeof item + JSON.stringify(item)) return obj.hasOwnProperty(typeof item + JSON.stringify(item)) ? false : (obj[typeof item + JSON.stringify(item)] = true) }) } console.log(unique(array));//[{value:1},{value:2}]ES 6はES 6の到来に伴い,SetとMapのデータ構造を用いることができ,Setを例にとると,ES 6は新しいデータ構造Setを提供した.配列に似ていますが、メンバーの値は一意で、重複する値はありません.重さを取るために準備されているような気がしますか?var array=[1,2,1,1,'1];function unique(array) { return Array.from(new Set(array)); } console.log(unique(array));//[1,2,“1”は更に簡略化することができる.
function unique(array) { return [...new Set(array)]; } さらに簡略化することもできます.
var unique=(a)=>[...new Set(a)]また、Mapを使うと:
function unique(arr){const seen=new Map()return arr.filter((a)=>!seen.has(a)&&seen.set(a,1)}JavaScriptの進化は,元の14行コードからES 6までの1行コードを再利用する方法が,JavaScriptという言語が絶えず進歩していることを示しており,今後の開発もますます効率的になると信じている.特殊なタイプの比較的重さを落とす方法はこれで終わりますが、重さを落とす要素のタイプは多種多様である可能性があります.例の簡単な1と'1'のほかにnull、undefined、NaN、オブジェクトなどもありますが、これらの要素について、これまでのこれらの方法の重さを落とす結果はどうでしょうか.その前に、var str 1='1';var str2 = new String('1');
console.log(str1 == str2);//true console.log(str1 === str2);//false
console.log(null == null);//true console.log(null === null);//true
console.log(undefined == undefined);//true console.log(undefined === undefined);//true
console.log(NaN == NaN);//false console.log(NaN === NaN);//false
console.log(/a/==/a/);//false console.log(/a/===/a/);//false
console.log({} == {});//false console.log({} === {});//falseでは、このような配列について:
var array = [1, 1, '1', '1', null, null, undefined, undefined, new String('1'), new String('1'),/a/,/a/, NaN, NaN]; 以上の方法で重くした結果はいったいどんなものだったのだろうか.わざわざリストを整理して、オブジェクトとNaNの重量除去の状況に焦点を当てた:方法結果はforループ[1,“1”,null,undefined,String,String,/a/,/a/,NaN]オブジェクトとNaNがindexOf[1,“1”,null,undefined,String,String,String,/a/,/a/,NaN,NaN]オブジェクトとNaNが重量除去されないことを示す.オブジェクトとNaNは、数字1も重くならず、filter+indexOfも重くならない[1,“1”,null,undefined,String,String,/a/,/a/]オブジェクトは重くならないNaNは、filter+sort[/a/,/a/,“1”,1,String,1,String,NaN,NaN,null,undefined]オブジェクトとNaNは重くならない数字1は、最適化されたキー値のペアを重くしない[1,“1”,null,undefined,String,/a/,NaN]全重量除去Set[1,“1”,null,undefined,String,String,/a/,/a/,NaN]オブジェクトは重量除去されませんNaN重量除去
なぜ以上の結果が出たのかを知りたいなら、2つのdemoを見るとわかります.
//demo1 var arr = [1, 2, NaN]; arr.indexOf(NaN);//-1 indexOf下位層は===を用いて判断するが,NaN==NaNの結果はfalseであるためindexOfを用いてNaN元素が見つからない
//demo2 function unique(array) { return Array.from(new Set(array)); } console.log(unique([NaN,NaN])//[NaN]Setは,NaN==NaNがfalseであるにもかかわらず,この2つの要素は重複していると考えた.
作者:宫若石リンク:https://www.jianshu.com/p/e0a46ad146e9出典:著作権は作者の所有である.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.