Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤javascript中数组内对象内的数组_Javascript_Arrays_Object_Methods_Filter - Fatal编程技术网

过滤javascript中数组内对象内的数组

过滤javascript中数组内对象内的数组,javascript,arrays,object,methods,filter,Javascript,Arrays,Object,Methods,Filter,我有这个对象,我需要一个函数来按类型或弱点(由用户决定)过滤口袋妖怪(整个对象)。 例如:“用户需要过滤所有火型口袋妖怪”,结果将是一个包含所有火型口袋妖怪对象的数组 var POKEMON = { "pokemon": [{ "id": 1, "num": "001", "name": "Bulbasaur", "img": "https://assets.pokemon.com/assets/cms2/img/pokedex/full/001.png",

我有这个对象,我需要一个函数来按类型或弱点(由用户决定)过滤口袋妖怪(整个对象)。 例如:“用户需要过滤所有火型口袋妖怪”,结果将是一个包含所有火型口袋妖怪对象的数组

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");
constfilterpokemon=(数据、whatToFilter、valueToCompare)=>{
返回数据。过滤器(口袋妖怪=>{
for(设i=0;i
使用
.includes
查看
口袋妖怪[whatToFilter]
数组中的任何项是否等于
值以进行比较

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

旁注,可能有点基于意见,但是你可以考虑从“代码> Pokimon < /Cube >中改变变量名(例如,这里我使用了“CuraTurObjo”),因为“Pokimon”可以是单数的或复数的,所以不完全清楚它是什么样的对象。 如果需要,还可以通过对参数进行分解来完全避免这种情况:

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

第一部分是正确的,但只需使用array find()操作符进行筛选,或者因为这些是简单的基本数组,所以可以只使用.indexOf(value)>-1或.includes()或其他一些操作符。我更喜欢find,因为它也适用于复杂类型

const filterPokemon = (pokemonList, propToFilter, value) => {  
  return pokemonList.filter(pokemon => {
    return pokemon[propToFilter].find(p => p === value);
  });
};

另一个选项是在
过滤器
功能中使用

const filterPokemon = (data, whatToFilter, valueToCompare) =>
{  
  return data.filter(pokemon => pokemon[whatToFilter].some(x => x === valueToCompare));
}
例子:
var POKEMON={
“口袋妖怪”:[{
“id”:1,
“num”:“001”,
“名称”:“Bulbasaur”,
“img”:https://assets.pokemon.com/assets/cms2/img/pokedex/full/001.png",
“类型”:[
“草”,
“毒药”
]
},
{
“id”:2,
“num”:“002”,
“姓名”:“Ivysaur”,
“img”:https://assets.pokemon.com/assets/cms2/img/pokedex/full/002.png",
“类型”:[
“草”,
“毒药”,
“火灾”
],
}
]};
常量filterPokemon=(数据、whatToFilter、valueToCompare)=>
{  
返回数据.filter(pokemon=>pokemon[whatToFilter].some(x=>x==valueToCompare));
}
let res=filterPokemon(POKEMON.POKEMON,“type”,“Fire”);
控制台日志(res)
.as控制台{背景色:黑色!重要;颜色:石灰;}
.作为控制台包装{最大高度:100%!重要;顶部:0;}