[JavaScript#17]基本JavaScript-オブジェクト巡回(Propertyのリスト)


オブジェクトの遍歴=Propertyのリスト(列挙)

  • オブジェクト内のすべてのキーに一度アクセスするコードが必要であれば、オブジェクト巡回が可能である.
  • ただし配列と異なり明確な順序がないため、対象の順序を「無順序保障の順序」と呼ぶ.
  • アレイを巡回する際にfor文を使用します.アレイにはlengthというキーがあるため、インデックスで各アレイ要素にアクセスできます.(オブジェクトには長さやインデックスがないため、for文にアクセスできません.)
  • 客体複文で使用可能Object.keys()for-in 문
  • Object.keys()

  • Object.keys()メソッドは、あるオブジェクトが持つ鍵のリストを配列に戻す.
  • const obj = {
      name: 'melon',
      weight: 4350,
      price: 16500,
      isFresh: true
    }
    
    Object.keys(obj) // ['name', 'weight', 'price', 'isFresh']
  • このように並べて、折り返しの複文を使うことができます.
  • const keys = Object.keys(obj)
    
    for (let i = 0; i < keys.length; i++) {
      const key = key[i] // 각각의 키 
      const value = obj[key] //키에 해당하는 각각의 값
    }

    Object.values(), Object.entries()

  • ES 6構文に対象作成者を追加した方法Object.valuesObject.entries
  • Object.valuesは、非オブジェクトキー値(Property値)からなる配列を返します.
  • Object.entryは、オブジェクトのキーと値のペアの配列を配列に読み込み、返します.各配列では、インデックス[0]の値は各キーで構成され、インデックス[1]の値はそのキーに対応するpropertyで構成される.
  • const values = Object.values(obj)
    // values === ['melon', 4350, 16500, true]
    
    const entries = Object.entries(obj)
    
    /*
    entries === [
      ['name', 'melon'],
      ['weight', 4350],
      ['price', 16500],
      ['isFresh', true]
    ]
    */

    for...文。

  • 複文for文のような文法ですが、オブジェクトや配列のために特に存在し、ES 6に追加された文法です.
  • 巡視対象及び通常配列の場合に使用可能.for (변수선언문 in 객체/배열) {...}
  • //배열 순회
    const arr = ['coconut', 'banana', 'pepper', 'coriander']
    
    for (let i = 0; i < arr.length; i ++) {
      console.log(i)
      console.log(arr[i])
    }
    
    for (let i in arr) { 
      console.log(i)
      console.log(arr[i])
    }
  • for..in文for文の条件文は省略可能(let i = 0; i < arr.length; i ++)
  • インデックスの値は、繰り返し文のループ数がJavaScriptエンジン内部で自動的に決定されます.
  • //객체 순회
    const obj = {
      name: 'melon',
      weight: 4350,
      price: 16500,
      isFresh: true
    }
    
    for (let key in obj) {
      const value = obj[key];
    
      console.log(key) //name, weight, price, isFresh
      console.log(value) //melon, 4350, 16500, true
    }
  • オブジェクトfor-in文を使用すると、for-in文のインデックスに変数が割り当てられ、数値ではなくオブジェクトのキーごとに文字列が割り当てられます.(name, melon, weight, 4350, price, 16500, isFresh, true)
  • Assignment


    以下の説明を読んでgetExamResult関数を実装してください.
    パラメータscoresは次のオブジェクトです.オブジェクト内の要素の数とキーの名前が異なる場合があります.オブジェクトの値には、次の9つの文字列のいずれかがあります.
    'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F'
    {
      '생활속의회계': '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,
    }
    // getExamResult 함수 만들기 
    // 새로운 객체 만들기 
    // 인자로 들어온 score 순회해보기
    // 새로운 객체에 scores에 있는 key 값을 다 포함시키기
    // 학점 문자열 숫자로 바꾸기
    // requiredClass 배열 안에 있는데 scores 객체에 없는 값은 0점 처리
    // required에 있는게 result에 없는지 확인
    // requried 순회
    // 순회한 값이 result에 없는지 확인
    // 없으면 0점
    
    // 첫번째 풀이
    const getExamResult = (scores, requiredClasses) => {
      let result = {};
      const matchScores = {
      ['A+']: 4.5,
      'A': 4,
      ['B+']: 3.5,
      'B': 3,
      ['C+']: 2.5,
      'C': 2,
      ['D+']: 1.5,
      'D': 1,
      'F': 0
      };
      
      for (let key in scores) {
        result[key] = matchScores[scores[key]]; //key 값을 새로운 배열에 넣어 주기 = 인자 key를 숫자로 바꿔주기 
      }
      
      requiredClasses.forEach((el) => {
        if (result[el] === undefined) {
          result[el] = 0;
        }
      })  
     return result;
    }
    
    //두번째 풀이
    const getExamResult = (scores, requiredClasses) => {
      let result = {};
      const matchScores = {
      ['A+']: 4.5,
      'A': 4,
      ['B+']: 3.5,
      'B': 3,
      ['C+']: 2.5,
      'C': 2,
      ['D+']: 1.5,
      'D': 1,
      'F': 0
      };
      
      const scoresKey = Object.keys(scores); //key값 배열로 가져오기
      //console.log(scoreKeys);
      //value 값 가져오기
      for (let i = 0; i < scoresKey.length; i++) {
      const name = scoresKey[i]; //key 배열 
      const score = scores[name]; //value 배열
      result[name] = matchScores[score]; //새로운 배열에 숫자로 변환해서 넣기
    }
      
      for (let i = 0; i < requiredClasses.length; i++) {
        const className = requiredClasses[i];
        if (!result[className]) { // === undefiend //result에 값을 다 담아놨기 때문에 result를 확인하면 된다! 
          result[className] = 0;
        }
      }
     return result;
    }
    
    //console.log 확인을 위한 예시
    const exampleScore = {
      '생활속의회계': 'C',
      '논리적글쓰기': 'B',
      '독일문화의이해': 'B+',
      '기초수학': 'D+',
      '영어회화': 'C+',
      '인지발달심리학': 'A+',
    }
    getExampleResult(exampleScore)