配列の脱重と平たい化
12944 ワード
配列の重さ除去と平たい化の方法はたくさんありますが、同じ機能を実現するために、いくつかの方法が複雑に実現されています.以下に簡単な方法をいくつか説明します.
1.配列のデバッグ
1.1 ES 5文法
1.2 ES 6文法
2.配列の平坦化
配列が平準化されているのは、[5,10,15,[20]]という重層の配列を平成1階[5,10,15,20]に撮ることです.Aray.prototype.flatを使って直接に多層配列を平成1階に撮ることができます.
2.1配列原型の方法 Aray.prototype.flat()は、入れ子の配列を1次元の配列にするために用いられる.この方法は新しい配列を返します.元のデータには影響がありません. パラメータを渡さない場合、デフォルトの「フラット」層は、1つの整数に入ることができ、「フラット」を望む層数を表します.着信<=0の整数は元の配列に戻ります.引き分けではありません. Infinityキーワードをパラメータとすると、何層でも1次元配列 に変換されます.
2.2 ES 5実現:再帰
1.配列のデバッグ
1.1 ES 5文法
function unique(arr){
var res = arr.filter((item,index,array)=>{
return array.indexOf(item) === index
})
return res
}
console.log(unique([1,2,1,3,'1','sf']))//[1, 2, 3, "1", "sf"]
1
と 1
は、文字列と数字はもともと同じものではないので、より合理的である.しかし、いくつかの小さなパートナーは、配列の重さを達成するために以下の方法を使用することがあります. :
function unique(arr){
var obj = {
}
var res = []
for(let i=0;i<arr.length;i++){
if(!obj.hasOwnProperty(arr[i])){
obj[arr[i]] = 1
res.push(arr[i])
}
}
return res
}
console.log(unique([1,2,1,3,'1','sf']))//[1, 2, 3, "sf"]
上記では、Objオブジェクトがkeyであるかどうかを判断することにより、Objが属性を追加し、配列resに要素を入れるが、このような実現はbugであり、Objのkeyはもともと文字列であるため、 1
と 1
は同じkeyであると考えられ、文字列1を削除することになる.1.2 ES 6文法
var unique = arr => [...new Set(arr)]
console.log(unique([1,2,1,3,'1','sf']))//[1, 2, 3, "1", "sf"]
そうです.意外にも感じなくてもいいです.一行のコードについて重さを実現しました.これはES 6が実現したSet
オブジェクトのおかげです.ここをクリックして詳細にSetを勉強します.2.配列の平坦化
配列が平準化されているのは、[5,10,15,[20]]という重層の配列を平成1階[5,10,15,20]に撮ることです.Aray.prototype.flatを使って直接に多層配列を平成1階に撮ることができます.
2.1配列原型の方法
[5, [10, [15,[20]]]].flat(Infinity) // [5,10,15,20]
2.2 ES 5実現:再帰
function flatten(arr){
var result = []
arr.forEach((item)=>{
if(Object.prototype.toString.call(item)==="[object Array]"){
result.push(...flatten(item))
}else{
result.push(item)
}
})
return result
}
console.log(flatten([1,[2,[3]],55]))
原理:配列の各要素を判断し、要素が配列であればflatten()
を再帰的に呼び出し、そうでなければresult
に直接追加する.注意: 。。。
2.3 ES 6実現 function flatten(arr){
while(arr.some(item=>Array.isArray(item))){
arr = [].concat(...arr)
}
return arr
}
原理:要素の中にまだ配列があるかどうかを循環的に判断することによって、存在は
を通じて配列を展開し、毎回1つの層をかき分ける.