[ジェコベNo.34]sort実施

16897 ワード

質問する


民主主義のためにプログラムを作って、背をあげたら、順番に立っているかどうかを確認します.(入力したキーはスペースで区切られています.)
입출력

입력: 176 156 155 165 166 169
출력: NO

입력: 155 156 165 166 169 176
출력: Y

それぞれのアルゴリズム🧐

  • のメッセージを受け取った後、split(""")で空白を残します.
  • sort関数を使用してソートします.
  • 条件文を使用して、sort関数と同じ場合、YではなくNを出力します.
  • 📝 split()
    sort()メソッドは、配列内の要素を適切な位置に並べ替え、配列を返します.ソートは安定したsortではないかもしれません.デフォルトのソート順は、文字列内のUnicodeコードポイントに従います.
    //다음 함수는 배열을 오름차순으로 정렬합니다 (Infinity 및 NaN이 포함되어 있지 않은 경우)
    
    function compareNumbers(a, b) {
      return a - b;
    }
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

    無効なコード💬

    const answer = prompt('키 입력하세요~').split(' ');
    
    let height = answer.sort((a,b) =>  a - b);
    // ----------------------------------------
    // arrow를 안 쓸 경우
    let height = answer.sort(function(a,b) {
    	return a - b;
    }
                             
    if(answer === height){
    	console.log('Y');
    } else {
    	console.log('N')
    }

    エラーコードの原因🗣


    入力のみをpromptとして受信すると、デフォルトタイプの文字列となり、入力したデータを参照タイプの配列に分割します.変換された参照タイプarrayが別の変数heightに格納されている場合、コピー値ではなくアドレスのみがコピーされるため、値が共有されます.値を共有すると、2つの変数の値は常に一致するため、必要なリンゴ値を出力できません.そのため、アップルの値が正常に出力されない理由は、Shellowコピーになっているからです.😥

    shallow copy & deep copy


    📝 Spread Operator
    展開構文では、配列や文字列などの繰り返し可能な文字をゼロまたは複数の引数(関数呼び出し)または要素(配列テキスト)に展開し、オブジェクトをゼロまたは複数のキー値ペアに展開できます.
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Spread_syntax
    (mdnの説明が理解できない場合は、私が書いたエラーコードの原因を確認できます)🐣)
    Spread Operatorには、浅いコピー(浅いコピー)と深いコピー(深いコピー)があります.サンプルコードを見てみましょう.

    shallow copy 💁‍♀️

    //원시타입인 string은 값이 공유되지 않아 string만 바뀐것을 확인 할 수 있다.
    let string = 'abc';
    let stringCopy = string;
    
    string = 'chage';
    
    console.log(`string: ${string}, stringCopy: ${stringCopy}`);
    //참조형 타입인 array는 값이 공유가 되어 array와 arraySharing이 바뀌는것을 볼 수 있다.
    
    let array = ['a', 'b', 'c'];
    let arraySharing = array;
    
    array.push('jetom');
    
    console.log(`array: ${array}, arraySharing: ${arraySharing}`;

    deep copy 💁


    デプスコピーは、データを参照するのではなく、新しいオブジェクト(値「のみ」など)にデータをコピーする方法です.いろいろありますが、ここではJSONのみを紹介します.(概念説明文ではないので🤤..) JSONは簡単にフォーマットを変換する方法で、parseとstringifyがあります.
    📝 JSON
    JSONオブジェクトには、JavaScriptオブジェクト注釈(JSON)を解析したり、値をJSONに変換したりする方法があります.JSONを直接呼び出したり、インスタンスを作成したりすることはできません.2つの方法以外に、興味のある機能はありません.
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON
    📝 JSON.stringify()
    JSON.stringify()メソッドは、JavaScript値またはオブジェクトをJSON文字列に変換します.あるいは、置換プログラムを関数として渡すと、変換前に値を変換できます.アレイに渡すと、結果には指定した属性のみが含まれます.
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
    const jetom = {
    	age: 5,
      	color: 'white',
        weight: '7kg'
    };
    
    //스트링으로 바뀔 때 값을 참조하는것이 아닌 복사를 해 온다.
    const jetomStr = JSON.stringify(jetom);
    
    console.log(typeof(jetom));
    console.log(typeof(jetomStr));
    
    console.log(jetomStr);

    📝 JSON.parse()
    JSON.parse()メソッドは、JSON文字列の構文を解析し、JavaScript値またはオブジェクトを生成します.あるいは、復元関数をパラメータとして渡すと、結果を返す前に変換できます.
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
    const jetom = {
    	age: 5,
      	color: 'white',
        weight: '7kg'
    };
    
    //객체를 형 변환 시켰으므로, 객체 형식의 문자열이다.
    const jetomStr = JSON.stringify(jetom);
    
    //객체 형식의 문자열을 또 한번 변환 시켜서 객체가 되었다.
    const jetomPar = JSON.parse(jetomStr)
    
    console.log(typeof(jetom));
    console.log(typeof(jetomStr));
    console.log(typeof(jetomPar));
    
    console.log(jetom.age === jetomPar.age);

    最終コード🧚‍♀️


    したがって、値参照をしたくない場合は、答えは入力を受け入れ、heightでsplitを行うしかありません.🤓
    const answer = prompt('키 입력하세요~');
    
    let height = answer.split(' ').sort((a,b) =>  a - b);
    
    if(answer === height){
    	console.log('Y');
    } else{
    	console.log('N');
    }
    値共有とレプリケーションにはreturnとconsoleが含まれます.logレベルに混同します.
    今日もJavaScriptの一日でした.🤯