Как использовать оператор If в цикле for-in? - PullRequest
0 голосов
/ 31 декабря 2018

Просто пытаюсь освоиться с вложенными объектами в массивах и в циклах.Все работает так, как я ожидаю, пока я не вставлю оператор if, тогда я не получу ожидаемых результатов вывода true в консоли.

Я пробовал различные сочетания нотаций / скобок длядоступ.

const animals = [
  {
    species: 'Pets',
    list: [
      'Dog',
      'Cat',
      'Rabbit',
      'Gerbil',
      'Turtle',
      'Canary'
    ]
  },
  {
    species: 'Wild',
    list: [
      'Bear',
      'Lion',
      'Deer',
      'Tiger',
      'Cougar',
      'Elk',
      'Beaver',
      'Elephant',
      'Rhino'
    ]
  },
  {
    species: 'Marine',
    list: [
      'Shark',
      'Salmon',
      'Squid',
      'Octopus',
      'Jellyfish'
    ]
  }
];

for(let i = 0; i < animals.length; i++) {
  for(let prop in animals[i]) {
    console.log(animals[i][prop])
    if(animals[i][prop] === 'Shark'){
       console.log(true)
    }
  }
}

Я бы хотел сохранить в журнале значение true, если значение равно «Акула»

Ответы [ 5 ]

0 голосов
/ 01 января 2019

Вы можете использовать код ниже

animals.flatMap(a=> a.list).filter(a=> a==='Shark').forEach(a=> console.log('true'))

0 голосов
/ 01 января 2019

Хочу добавить функциональный подход к возможным решениям:

const animals = [{ species: 'Pets', list: ['Dog', 'Cat', 'Rabbit', 'Gerbil', 'Turtle', 'Canary'] }, { species: 'Wild', list: ['Bear', 'Lion', 'Deer', 'Tiger', 'Cougar', 'Elk', 'Beaver', 'Elephant', 'Rhino' ] }, { species: 'Marine', list: ['Shark', 'Salmon', 'Squid', 'Octopus', 'Jellyfish'] }];

const searchQuery = 'Shark';

function fishForSharks(animal) {
  return animal.list.includes(searchQuery);
}

function getKeyPositionFromValue(obj) {
  return Object.keys(obj.list).find(key => obj.list[key] === searchQuery);
}

function output(obj) {
  const output = document.querySelector('.output');

  output.innerHTML += `
  <li>
The <strong>${obj.species}</strong> species 
contains a ${searchQuery} at position: 
${getKeyPositionFromValue(obj)}
  </li>`;
}

animals.filter(fishForSharks).map(output);
<ul class="output"></ul>

http://jsfiddle.net/ujf1t2p0/

0 голосов
/ 31 декабря 2018

Вам также нужно перебрать массив

const animals = [{ species: 'Pets', list: ['Dog', 'Cat', 'Rabbit', 'Gerbil', 'Turtle', 'Canary'] }, { species: 'Wild', list: ['Bear', 'Lion', 'Deer', 'Tiger', 'Cougar', 'Elk', 'Beaver', 'Elephant', 'Rhino' ] }, { species: 'Marine', list: ['Shark', 'Salmon', 'Squid', 'Octopus', 'Jellyfish'] }]

for (let i = 0; i < animals.length; i++) {
    for (let prop in animals[i]) {
        // console.log(animals[i][prop]);
        for (var item of animals[i][prop]) {
            if (item === 'Shark') {
                console.log(true);
            }
        }
    }
}

Более коротким подходом будет итерация animals, а затем list.

const animals = [{ species: 'Pets', list: ['Dog', 'Cat', 'Rabbit', 'Gerbil', 'Turtle', 'Canary'] }, { species: 'Wild', list: ['Bear', 'Lion', 'Deer', 'Tiger', 'Cougar', 'Elk', 'Beaver', 'Elephant', 'Rhino' ] }, { species: 'Marine', list: ['Shark', 'Salmon', 'Squid', 'Octopus', 'Jellyfish'] }]

animals.forEach(({ list }) => {
    if (list.includes('Shark')) {
        console.log(true);
    }
});
0 голосов
/ 31 декабря 2018

Вот подход, который использует Array.prototype.forEach и деструктуризацию объектов ES6:

const animals = [{
    species: 'Pets',
    list: [
      'Dog',
      'Cat',
      'Rabbit',
      'Gerbil',
      'Turtle',
      'Canary'
    ]
  },
  {
    species: 'Wild',
    list: [
      'Bear',
      'Lion',
      'Deer',
      'Tiger',
      'Cougar',
      'Elk',
      'Beaver',
      'Elephant',
      'Rhino'
    ]
  },
  {
    species: 'Marine',
    list: [
      'Shark',
      'Salmon',
      'Squid',
      'Octopus',
      'Jellyfish'
    ]
  }
];

animals.forEach(function(el) {
  var {
    species,
    list
  } = el;

  list.forEach(function(s) {
    if (s === 'Shark') {
      console.log('Found shark');
    }
  })
});
0 голосов
/ 31 декабря 2018

Чтобы достичь ожидаемого результата, используйте

animals[i][prop].includes('Shark')

Проблема: animals [i] [prop] в вашем коде возвращает каждое свойство объекта и значение - Shark является одним из массиваэлемент

Рабочий код приведен ниже

const animals = [
{
    species: 'Pets',
    list: [
        'Dog',
        'Cat',
        'Rabbit',
        'Gerbil',
        'Turtle',
        'Canary'
    ]

},
 {
     species: 'Wild',
     list: [
         'Bear',
         'Lion',
         'Deer',
         'Tiger',
         'Cougar',
         'Elk',
         'Beaver',
         'Elephant',
         'Rhino'
     ]
 },
  {
      species: 'Marine',
      list: [
          'Shark',
          'Salmon',
          'Squid',
          'Octopus',
          'Jellyfish'
      ]
 }

]

for(let i = 0; i < animals.length; i++) {
for(let prop in animals[i]) {
    console.log(animals[i][prop])
   console.log(animals[i][prop].includes('Shark'))

}
}
...