Доступ к объектным ключам с помощью цикла for - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть несколько шахматных фигур, хранящихся в виде массива объектов, и я хочу получить доступ к ключам, использующим для l oop, но я получаю сообщение об ошибке «Не удается прочитать свойство« 0 »из неопределенного». Почему это происходит?

Спасибо за любую помощь!

Javascript:

pawn = {
    color: [
              {c1: 'white'}, {c2: 'white'}, {c3: 'white'}, {c4: 'white'}, {c5: 'white'}, {c6: 'white'},
              {c7: 'white'}, {c8: 'white'}, {c9: 'black'}, {c10:'black'}, {c11: 'black'}, {c12: 'black'},
              {c13:'black'}, {c14:'black'}, {c15:'black'}, {c16:'black'}
           ],
   playable: function()
   {        
        k1 = [];
        for (i = 0; i < 16; i++)
        {
            k1.push(Object.keys(pawn.color[i]));
            console.log(k1);    //[['c1'], ['c2'], ['c3'], ['c4'], ['c5'], ['c6'], ['c7'], ['c8'], 
                          // ['c9'], ['c10'], ['c11'], ['c12'], ['c13'], ['c14'], ['c15'], ['c16']];
        }

        for (piece = 0; piece < 16; piece++)
            {
                if (pawn.color[piece].k1[piece][0] == 'white'){ //error msg.
                    console.log('white');
                }

                if (pawn.color[piece].k1[piece][0] == 'black'){ //error msg.
                    console.log('black');
                }
            }
   };

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

иногда может быть сложно выяснить, как получить доступ к массивам с объектами. Проверьте синтаксис и дайте мне знать, если вы не понимаете.

pawn = {
    color: [
              {c1: 'white'}, {c2: 'white'}, {c3: 'white'}, {c4: 'white'}, {c5: 'white'}, {c6: 'white'},
              {c7: 'white'}, {c8: 'white'}, {c9: 'black'}, {c10:'black'}, {c11: 'black'}, {c12: 'black'},
              {c13:'black'}, {c14:'black'}, {c15:'black'}, {c16:'black'}
           ]};
   function payable()
   {        
        k1 = [];
        for (i = 0; i < 16; i++)
        {
            k1.push(Object.keys(pawn.color[i]));
           // console.log(k1);    //[['c1'], ['c2'], ['c3'], ['c4'], ['c5'], ['c6'], ['c7'], ['c8'], 
                          // ['c9'], ['c10'], ['c11'], ['c12'], ['c13'], ['c14'], ['c15'], ['c16']];
        }  
        
   

        for (piece = 0; piece < 16; piece++)
            {          
            
                if (pawn.color[piece][k1[piece][0]] == 'white'){ //error msg.
                    console.log('white');
                }

                if (pawn.color[piece][k1[piece][0]] == 'black'){ //error msg.
                    console.log('black');
                }
            }
   };
   
   payable();
0 голосов
/ 12 апреля 2020

Ваш массив color содержит 16 записей. Каждая из этих записей является объектом вида:

{ key: color }

, где key - это "c1" - "c16", а color - "черный" или "белый".

В вашем for-l oop вы попробуете это:

if (pawn.color[piece].k1[piece][0] == 'white'){

Давайте разберем это:

  • pawn.color [piece] - это дает объект наподобие {c1: 'white'}
  • pawn.color [piece] .k1 - это дает undefined, поскольку объект не имеет значения k1.
  • pawn.color [piece] .k1 [piece] - дает TypeError, потому что вы пытались получить доступ к undefined

То, что вы, вероятно, хотели, это:

if (pawn.color[piece][k1[piece][0]] == 'white') {

, но легче прочитать, если вы выделите его немного так:

const firstKey = k1[piece][0];
if (pawn.color[piece][firstKey] == 'white') {
...