Доступ к объектам - PullRequest
       11

Доступ к объектам

0 голосов
/ 21 ноября 2018

Я написал простую функцию для доступа к некоторым значениям в массиве ниже, и в массив вложены несколько объектов.

Мой вопрос касается двух моих петель.Я понимаю, что сначала я должен пройти через массив, чтобы получить доступ к 3 объектам, но почему я должен пройти по 3 объектам, прежде чем я смогу получить доступ к значениям?

По сути, почему я не могу запустить начальный for зациклите и получите доступ к звуку, выполнив это:

animalNoises[i][animal][country]

вышеописанное возвращается как неопределенное для меня.Это как-то связано с тем, как структурированы все 3 животных объекта?

Спасибо за помощь.Я действительно ценю сообщество переполнения стека за постоянную помощь.

function petSounds(animal, country) {
let phrase = ''
for (let i = 0; i < animalNoises.length; i++) {
  for (let key in animalNoises[i]){
    if (animal === key){
      let sound = animalNoises[i][key][country];
      phrase = animal + 's' + ' in ' + country + ' say ' + sound
      }
    }
  }
 return phrase
}

    let animalNoises = [
  { 'dog': {
    'America' : 'Woof! Woof!',
    'Germany' : 'Wau Wau!',
    'England' : 'Bow wow!',
    'Uruguay' : 'Jua jua!',
    'Afrikaans' : 'Blaf!',
    'Korea' : 'Mong mong!',
    'Iceland' : 'Voff voff!',
    'Albania' : 'Ham!',
    'Algeria' : 'Ouaf ouaf!'
    }
  },
  { 'cat': {
    'America' : 'Meow',
    'Germany' : 'Miauw!',
    'England' : 'mew mew',
    'Uruguay' : 'Miau Miau!',
    'Afrikaans' : 'Purr',
    'Korea' : 'Nyaong!',
    'Iceland' : 'Kurnau!',
    'Albania' : 'Miau',
    'Algeria' : 'Miaou!'
    }
  },
  { 'chicken': {
    'America' : 'Cluck cluck',
    'Germany' : 'tock tock tock',
    'England' : 'Cluck Cluck',
    'Uruguay' : 'gut gut gdak',
    'Afrikaans' : 'kukeleku',
    'Korea' : 'ko-ko-ko',
    'Iceland' : 'Chuck-chuck!',
    'Albania' : 'Kotkot',
    'Algeria' : 'Cotcotcodet'
    }
  }
];

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Если вы хотите сохранить имеющуюся форму, вы всегда можете использовать Array#find(), а затем in проверку оператора, а затем с литералами шаблона вы можете легко создать свою строку.

function petSounds(animal, country) {
 const noise = animalNoises.find(obj => animal in obj)[animal][country];
 return `${animal}s in ${country} say ${noise}`
}

    let animalNoises = [
  { 'dog': {
    'America' : 'Woof! Woof!',
    'Germany' : 'Wau Wau!',
    'England' : 'Bow wow!',
    'Uruguay' : 'Jua jua!',
    'Afrikaans' : 'Blaf!',
    'Korea' : 'Mong mong!',
    'Iceland' : 'Voff voff!',
    'Albania' : 'Ham!',
    'Algeria' : 'Ouaf ouaf!'
    }
  },
  { 'cat': {
    'America' : 'Meow',
    'Germany' : 'Miauw!',
    'England' : 'mew mew',
    'Uruguay' : 'Miau Miau!',
    'Afrikaans' : 'Purr',
    'Korea' : 'Nyaong!',
    'Iceland' : 'Kurnau!',
    'Albania' : 'Miau',
    'Algeria' : 'Miaou!'
    }
  },
  { 'chicken': {
    'America' : 'Cluck cluck',
    'Germany' : 'tock tock tock',
    'England' : 'Cluck Cluck',
    'Uruguay' : 'gut gut gdak',
    'Afrikaans' : 'kukeleku',
    'Korea' : 'ko-ko-ko',
    'Iceland' : 'Chuck-chuck!',
    'Albania' : 'Kotkot',
    'Algeria' : 'Cotcotcodet'
    }
  }
];

В противном случае с вашей версией вы зацикливаетесь во время зацикливания, когда вы можете просто проверить существование.

Конечно, есть много способов снять шкуру с кошки, поэтому приведенное выше эквивалентно

function petSounds(animal, country) {
 const noise = animalNoises.find(obj => obj.hasOwnProperty(animal))[animal][country];
 return `${animal}s in ${country} say ${noise}`
}

Конечно, если вы получаете этот JSON откуда-то, вы можете уменьшить его, а затем связать ключи и значения в суперобъекте (используя Array#reduce() и Object.entries())

animalNoises = animalNoise.reduce((acc, obj) => {
  Object.entries(obj).forEach(([key, value]) => {
   acc[key] = value;
  });
  return acc;
 },
 {}
)

function petSounds(animal, country) {
  return `${animal}s in ${country} say ${animalNoises[animal][country]}`;
}

Если вы хотите узнать больше о классных вещах, которые вы можете делать с массивами, вам следует проверить MDN для массивов JavaScript

Оператор in являетсядействительно полезный способ сделать Object#hasOwnProperty() короче

И, как всегда, гораздо больше информации о JavaScript можно найти на MDN


Некоторые дополнительные развлечения с Сеструктуризация объекта просто еще один способ упорядочить вещи:

function petSounds(animal, country) {
 const { [animal]: { [country]: noise } } = animalNoises.find(obj => animal in obj);
 return `${animal}s in ${country} say ${noise}`
}
0 голосов
/ 21 ноября 2018

Ваше решение работает, с одним циклом for.Вы пропустили указание одинарных кавычек.Когда я просто утешаю это, он возвращает определенное значение.

animalNoises[0]['dog']['Korea']
"Mong mong!"

В цикле вам нужно получить доступ из вашего массива, указав имя ключа и значения страны.

Это не имеет ничего общегос тем, как структурированы все 3 объекта животных

Когда я вызываю вашу функцию, она работает нормально.

petSounds('dog', 'Korea')
"dogs in Korea say Mong mong!"

Или вы можете изменить свою функцию, как показано ниже, что делает то же самое, сокращая внутренний цикл:

function petSounds(animal, country) {
let phrase = ''
  for (let i = 0; i < animalNoises.length; i++) {
    let key = Object.keys(animalNoises[i])[0];
    if (animal === key){
      let sound = animalNoises[i][key][country];
      phrase = animal + 's' + ' in ' + country + ' say ' + sound
    }
  }
  return phrase
}
0 голосов
/ 21 ноября 2018

Вам нужно обновить json, чтобы упростить функцию (используйте объект, набранный по типу животного):

function petSounds(animal, country) {
  const sound = animalNoises[animal][country];
  const phrase = animal + 's' + ' in ' + country + ' say ' + sound;
  return phrase;
}

let animalNoises = {
  'dog': {
    'America': 'Woof! Woof!',
    'Germany': 'Wau Wau!',
    'England': 'Bow wow!',
    'Uruguay': 'Jua jua!',
    'Afrikaans': 'Blaf!',
    'Korea': 'Mong mong!',
    'Iceland': 'Voff voff!',
    'Albania': 'Ham!',
    'Algeria': 'Ouaf ouaf!'

  },
  'cat': {
    'America': 'Meow',
    'Germany': 'Miauw!',
    'England': 'mew mew',
    'Uruguay': 'Miau Miau!',
    'Afrikaans': 'Purr',
    'Korea': 'Nyaong!',
    'Iceland': 'Kurnau!',
    'Albania': 'Miau',
    'Algeria': 'Miaou!'
  },
  'chicken': {
    'America': 'Cluck cluck',
    'Germany': 'tock tock tock',
    'England': 'Cluck Cluck',
    'Uruguay': 'gut gut gdak',
    'Afrikaans': 'kukeleku',
    'Korea': 'ko-ko-ko',
    'Iceland': 'Chuck-chuck!',
    'Albania': 'Kotkot',
    'Algeria': 'Cotcotcodet'
  }
};

console.log(petSounds('cat', 'America'));
console.log(petSounds('dog', 'Iceland'));
console.log(petSounds('chicken', 'Germany'));
...