Фильтровать массив внутри объекта внутри массива в JavaScript - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть этот объект, и мне нужна функция для фильтрации покемонов (целых объектов) по типу или слабостям (решает пользователь).Например: «пользователю необходимо отфильтровать всех покемонов огненного типа», и результатом будет массив, содержащий каждый объект покемонов огненного типа

var POKEMON = {
  "pokemon": [{
    "id": 1,
    "num": "001",
    "name": "Bulbasaur",
    "img": "https://assets.pokemon.com/assets/cms2/img/pokedex/full/001.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.71 m",
    "weight": "6.9 kg",
    "candy": "Bulbasaur Candy",
    "candy_count": 25,
    "egg": "2 km",
    "spawn_chance": 0.69,
    "avg_spawns": 69,
    "spawn_time": "20:00",
    "multipliers": [1.58],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "next_evolution": [{
      "num": "002",
      "name": "Ivysaur"
    }, {
      "num": "003",
      "name": "Venusaur"
    }]
  },{
    "id": 2,
    "num": "002",
    "name": "Ivysaur",
    "img": "https://assets.pokemon.com/assets/cms2/img/pokedex/full/002.png",
    "type": [
      "Grass",
      "Poison"
    ],
    "height": "0.99 m",
    "weight": "13.0 kg",
    "candy": "Bulbasaur Candy",
    "candy_count": 100,
    "egg": "Not in Eggs",
    "spawn_chance": 0.042,
    "avg_spawns": 4.2,
    "spawn_time": "07:00",
    "multipliers": [
      1.2,
      1.6
    ],
    "weaknesses": [
      "Fire",
      "Ice",
      "Flying",
      "Psychic"
    ],
    "prev_evolution": [{
      "num": "001",
      "name": "Bulbasaur"
    }],
    "next_evolution": [{
      "num": "003",
      "name": "Venusaur"
    }]
  },
... (+149 other pokemon)

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

const filterPokemon = (data, whatToFilter, valueToCompare) => {  
  return data.filter(pokemon => {
    for(let i = 0 ; i < pokemon[whatToFilter].length ; i++){
      if(pokemon[whatToFilter][i] === valueToCompare){       
        return pokemon;
      }
    }
  });
};

filterPokemon(POKEMON.pokemon, "type", "Fire");

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы имеете право на первую часть, но просто используйте оператор array find () для фильтрации, или, поскольку это простые примитивные массивы, вы можете просто использовать .indexOf (value)> -1 или .include () или несколькодругие операторы.Я предпочитаю находить, потому что он работает и со сложными типами.

const filterPokemon = (pokemonList, propToFilter, value) => {  
  return pokemonList.filter(pokemon => {
    return pokemon[propToFilter].find(p => p === value);
  });
};
0 голосов
/ 28 февраля 2019

Другой вариант - использовать Array.some () внутри функции filter.

const filterPokemon = (data, whatToFilter, valueToCompare) =>
{  
  return data.filter(pokemon => pokemon[whatToFilter].some(x => x === valueToCompare));
}

Пример:

var POKEMON = {
  "pokemon": [{
    "id": 1,
    "num": "001",
    "name": "Bulbasaur",
    "img": "https://assets.pokemon.com/assets/cms2/img/pokedex/full/001.png",
    "type": [
      "Grass",
      "Poison"
    ]
  },
  {
    "id": 2,
    "num": "002",
    "name": "Ivysaur",
    "img": "https://assets.pokemon.com/assets/cms2/img/pokedex/full/002.png",
    "type": [
      "Grass",
      "Poison",
      "Fire"
    ],
  }
]};

const filterPokemon = (data, whatToFilter, valueToCompare) =>
{  
    return data.filter(pokemon => pokemon[whatToFilter].some(x => x === valueToCompare));
}
    
let res = filterPokemon(POKEMON.pokemon, "type", "Fire");
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
0 голосов
/ 28 февраля 2019

Вместо этого используйте .includes, чтобы увидеть, совпадают ли какие-либо элементы в массиве pokemon[whatToFilter] с valueToCompare:

const filterPokemon = (data, whatToFilter, valueToCompare) => {  
  return data.filter(creatureObj => (
    creatureObj[whatToFilter].includes(valueToCompare)
  ));
};

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

Можно также избежатьэто полностью путем разрушения параметра, если вы хотите:

const filterPokemon = (data, whatToFilter, valueToCompare) => {  
  return data.filter(({ [whatToFilter]: arr }) => (
    arr.includes(valueToCompare)
  ));
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...