わかりにくいsort()...

5349 ワード

指定した数値配列で、0を配列の最後に移動します.
元の数字の順番を変えないでください.
(新しいアレイは作成しないでください.)
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Code Kataから离れていた今生を打ち負かされた时、Yonghyeonは私にこの问题を解いたのではないかと闻いた.
問題を見るとすぐに思いつく方法は.
1.並べ替え後、
2.for文で要素を1つずつチェックし、0に遭遇した場合count++で変数に格納します.
3.一番前の数字をcountの数字と一緒に移動し、
4.pushにcount数字を加える.
ああ、、、、、聞くだけで臭い.🙊
頭を包む時、まず龍賢の答えを見て、
const moveZeroes = nums => {
return nums.sort((a, b) => (a === 0) - (b === 0))
}
わあユリカ!3行だけで終わります.
答えられなかったので、正解を見て、理解の方向に向かい、sortを詳しく知りました.
sortに対してarray.sort(a,b)=>return a-bは昇順、b-aは降順で、知っていますが、a,bは何なのか分かりません.
私が持っているデータの中で、Priceのコンソールを撮って、理解しました.
  “goods”: [
    {  
      “price”: 59000,
      “review_count”: 0,
      “colors”: [“red”, “green”, “gray”]
    },
    {
      “price”: 39000,
      “review_count”: 0,
      “colors”: [“white”]
    },
    {
    
      “review_count”: 0,
      “colors”: [“black”]
    },
    {
    
      “review_count”: 3,
      “colors”: [“white”]
    },
    {
  	  “price”: 39000,
      “review_count”: 2,
      “colors”: [“white”]
    },
    {
       “price”: 45000,
      “review_count”: 4,
      “colors”: [“black”]
    },
    {
	   “price”: 99000,
      “review_count”: 6,
      “colors”: [“white”]
    },
    {
 	   “price”: 42000,
      “review_count”: 1,
      “colors”: [“white”]
    },
    {
  	
      “review_count”: 2,
      “colors”: [“green”]
    },
    {
      “price”: 39000,
      “review_count”: 0,
      “colors”: [“white”]
    }
  ]
}

そのまま出てきましたaは前だと思って、bは後だと思って、全然違います!ブログを参照:
ここで混同されやすいのはaとbですソースコードsort((a,b)=>b−a)および配列[1,2,3]が第1のループに位置するとき、2はaに入り、1はbに入る.これはa,bのアルファベット順とは逆である.これを混同した場合は、sort(next,prev)=>prev-nextと同じフォーマットを使用することをお勧めします.
そうですか.撮影されたライブを見ると、2番目の1番目の比較->位置を変えたら->2,1の比較->次は3,2の比較です.
ブログ記事を書き直す.
1または0または-1ですが、変更は-1のみです.
「≪比較機能|Compare Feature|emdw≫」を作成する際には、返される値が重要です.数値を返さなければなりませんが、全部で3つの状況に分けることができます.
0より大きい
0
0未満
0によって3つのケースに分けられます.
パラメータa,bが0より大きい場合、[a,b]の値が入力されると、[a,b]になります.a先に来なさい.
パラメータa,bで戻り値が0の場合、[a,b]の値が入力されている場合でも[a,b]である.aとbの位置を保持します.
パラメータa,bで戻り値が0未満の場合、[a,b]の値はbより優先される.[b,a]になりました.
したがって、ソート数のsort関数を作成する場合、たとえば配列[1,2,3,4,5]がある場合、ソート時にすべてのエンティティが順番に並べられているため、変化がなければ、値1,2,3,4は順番にaに入り、値2,3,4は順番にbに入ります.ペアで表示される値は、[2,1]、[3,2]、[4,3]および[5,4]であり、aおよびbの順である.
しかし、通常、ソート中に内部の値が変化するため、a、bにはソート中に変更した値が実際に含まれます.新しく入力した値が大きい場合は、「比較機能」を作成して置き換えるにはどうすればいいですか?
上記の状況の数をよく考えてください.もし後ろから入ってきたのが大きいとしたら?置換交換する時-1に戻ればいいですよね?
龍賢のコードに戻ります.
const moveZeroes = nums => {
return nums.sort((a, b) => (a === 0) - (b === 0))
}
a==0 b==0という条件は何ですか?
Yonghyeonはブログでよく説明してくれました😏
a==0,b==0の条件で値が0の場合はtrueとなり、0ではなく1の値となり、この条件では0以外の値がfalseとなるため-1の値が得られる.これを利用して、0をすべて一番後ろに移動することができます.
sortについて深く考えず、盲目的に使っているだけで、上に整理されたブログを見て、起動方法について少し理解しました.
一見簡単な問題のように見えるが、深く入り込むと難しい.コードがどのように機能しているかを理解し、使用することが重要なようです.
参考資料:
sort関数のその他の式
竜賢のブログ