过滤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;}