JS|科目単位アルファベット変更関数の作成


問題を解く目的

  • オブジェクトのキー値:括弧と点記号にアクセスする方法について説明します.
  • オブジェクトの値は、
  • の複文で巡回できます.
  • オブジェクトのプロパティを統合して、他のオブジェクトに値を割り当てることができます.
  • 質問する


    以下の説明を読んでgetExamResult関数を実装してください.
    パラメータscoresは次のオブジェクトです.オブジェクト内の要素の数とキーの名前が異なる場合があります.オブジェクトの値には、次の9つの文字列のいずれかがあります.
    'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F'
    
    scores = {
      '생활속의회계': 'C',
      '논리적글쓰기': 'B',
      '독일문화의이해': 'B+',
      '기초수학': 'D+',
      '영어회화': 'C+',
      '인지발달심리학': 'A+',
    }
    
    パラメータrequiredClassesは、次のように文字列配列です.
    ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']
    関数を実装して、次の条件を満たすオブジェクトを返します.
    スコアオブジェクトが持つキーは、新しいオブジェクトに含める必要があります.ただし、これらの値は、次の原理に従って数値に変換して割り当てる必要があります.
    A+ => 4.5
    A => 4
    B+ => 3.5
    B => 3
    C+ => 2.5
    C => 2
    D+ => 1.5
    D => 1
    F => 0
    アイテムがRequiredClosses配列の要素として存在し、スコアのキーが存在しない場合は、その要素は新しいオブジェクトのキーであり、値は0である必要があります.上記の例で説明したオブジェクトと配列がパラメータとして入力されている場合、次のオブジェクトが返されます.要素間の順序は異なる場合がありますが、スコアには関係ありません.
    {
      '생활속의회계': 2,
      '논리적글쓰기': 3,
      '독일문화의이해': 3.5,
      '기초수학': 1.5,
      '영어회화': 2.5,
      '인지발달심리학': 4.5,
      '공학수학': 0,
      '컴퓨터과학개론': 0,
    }

    解法



    新しいオブジェクトを作成して値を挿入...値を他のオブジェクトと比較...また割り当て...
    静かに座って考えていたら、考えが狂って、白い板の上でゆっくりと整理されていました.
    まるまる2時間も悩んだが、結局は自分の力で満足感を得た.
    自分の悩みを解決するための考え方と、会話で知っている解決策をまとめてみましょう.

    私の答え


    構想


    step 1

    scoresオブジェクトの値は、それぞれkey(과목명)およびvalue(알파벳 학점)に配列される.
    value(アルファベット単位)値を数値に変換する新しい配列numValues(숫자 학점)が作成された.
    // scores의 key와 value 값들 배열화
    const keys = Object.keys(scores);
    const values = Object.values(scores);
    
    
    // values값 숫자로 바꾸기
    const numValues = values.map(x =>
    {if(x === 'A+'){return 4.5}
    else if(x === 'A'){return 4}
    else if(x === 'B+'){return 3.5}
    else if(x === 'B'){return 3}
    else if(x === 'C+'){return 2.5}
    else if(x === 'C'){return 2}
    else if(x === 'D+'){return 1.5}
    else if(x === 'D'){return 1}
    else if(x === 'F'){return 0}
    });

    step 2


    空の新しいゲストobjが作成され、{科目名:デジタル単位}として付与されます.
    まず、RequiredClassesを考慮せずに、単位を文字>>数字に変換する対象の実装を完了します.
    // {scores 과목:숫자점수} 객체 생성 및 값 할당 
    const obj = {};
    for (let i in keys){
    obj[keys[i]] = numValues[i];};

    step 3

    requiredClasses対象のkey(과목명)において、点数に含まれない科目名 value값(숫자 학점)は0を与えるべきである.
    {ScoresとRequiredClossesの差セット科目名:0}形状を持つ新しいオブジェクト(plusObject)を生成し、科目名の差セットを求めてplusObjectに割り当てる.
    科目名の差セットはろ過方法を用いて,スコアに含まれないキー値の新しい配列を返す方式を選択した.let difference = a.filter(x => !b.includes(x))
    // {scores & requiredClasses 차집합 과목 : 0} 객체(plusObj) 생성
    const plusObj = {};  
    const minor = requiredClasses.filter(x => !keys.includes(x));
    
    //plusObj에 key(minor):value(0) 값 할당
    for(let i in minor){
      plusObj[minor[i]]=0;
    };
    

    step 4


    {Scores科目名:数値単位}のobjオブジェクトと{Scores/RequiredClossesのサブセット科目名:0}のplusObjectのオブジェクトfinalを作成して返します.
    // 기존 obj객체와 plusObj객체를 합치고 반환
    const final = Object.assign(obj,plusObj);
    return final;

    正しいコード

    const getExamResult = (scores, requiredClasses) => {
    
    // scores의 key와 value 값들 배열화
    const keys = Object.keys(scores);
    const values = Object.values(scores);
    
    
    // values값 숫자로 바꾸기
    const numValues = values.map(x =>
    {if(x === 'A+'){return 4.5}
    else if(x === 'A'){return 4}
    else if(x === 'B+'){return 3.5}
    else if(x === 'B'){return 3}
    else if(x === 'C+'){return 2.5}
    else if(x === 'C'){return 2}
    else if(x === 'D+'){return 1.5}
    else if(x === 'D'){return 1}
    else if(x === 'F'){return 0}
    });
    
    
    // {scores 과목:숫자점수} 객체 생성 및 값 할당 
    const obj = {};
    for (let i in keys){
    obj[keys[i]] = numValues[i];};
    
    
    // {scores & requiredClasses 차집합 과목 : 0} 객체(plusObj) 생성
    const plusObj = {};  
    const minor = requiredClasses.filter(x => !keys.includes(x));
    
      
    //plusObj에 key(minor):value(0) 값 할당
    for(let i in minor){
      plusObj[minor[i]]=0;
    };
    
      
    // 기존 obj객체와 plusObj객체를 합치고, 반환
    const final = Object.assign(obj,plusObj);
    return final;
    

    に感銘を与える

  • アルファベット単位をデジタル単位に変換する過程で、点数の値を配列に変換し、条件に基づいて新しい配列を作成したmapメソッドを利用して、それぞれが変換され、プロセスが長く複雑である.
  • 変数を使用してオブジェクトにアクセスするには、点記号ではなく括弧記号が必要であることは理論的に知られていますが、問題を解決する時間があります.
  • セッションプール


    Q&A会では本題の解題過程を紹介してくれましたが、私と何が違いますか.

    思考の流れ&正解コード

    const getExamResult = (scores, requiredClasses) => {
      
      // 비어있는 새로운 객체object 만들기
      const obj = new Object();
      
      
      // {알파벳 학점 : 숫자 학점} 값의 객체 만들기
      const gradeMap = {
        "A+":4.5,
        "A":4,
        "B+":3.5,
        "B":3,
        "C+":2.5,
        "C":2.0,
        "D+":1.5,
        "D":1,
        "F":0
      }
      
      
      // scores[key](알파벳 학점)를 변수 grade에 할당
      // 빈 객체 obj의 key에는 scores의 key(과목명)를, 값에는 gradeMap의 값(숫자 학점) 할당 
      for (let key in scores) {
        const grade = scores[key];
        obj[key] = gradeMap[grade];
      }
      
      
      // requiredClasses의 값(과목명)을 변수 ClassName에 할당
      // obj의 key 중 ClassName의 값이 없으면 undefined가 반환되니, 그럴 경우 값에 0할당
      // 최종 답안인 obj 리턴
      for (let i = 0; i < requiredClasses.length; i++) {
        const className = requiredClasses[i];
        if (obj[className] === undefined) {
          obj[className] = 0;
        }
      }
      return obj;
    }

    に感銘を与える


  • 私の解答とは異なり、{アルファベット単位:数値単位}のオブジェクトgradeMapが作成され、新しい空のオブジェクトにより簡単なfor文key、value値が割り当てられます.つまり、オブジェクトのプロパティを使用すると便利です.

  • また、scoresとrequiredClossesの科目順位セットからなるオブジェクトを再作成し、最終的に前のオブジェクトとマージされた値を返しました.ここでは、オブジェクトのプロパティを使用して、値がundefinedになった場合、値に0を割り当てる方法を使用しました.