技术问询:对象数组取值打印键与宝可梦进化查询函数实现
让我一步步帮你解决这两个问题:
问题1:查找对象数组中存储的值,并打印对应的键
要实现这个需求,我们可以遍历数组中的每个对象,再逐个检查对象的键值对,当值匹配目标时就打印对应的键。这里用一个具体的例子来演示:
假设我们有这样的对象数组:
const pokemonArray = [ { id: 1, name: "Bulbasaur", type: "Grass" }, { id: 2, name: "Charmander", type: "Fire" }, { id: 3, name: "Squirtle", type: "Water" } ];
我们可以写一个通用函数来完成查找:
function printKeysByTargetValue(array, targetValue) { array.forEach(item => { // 将对象转换为键值对数组,方便遍历 Object.entries(item).forEach(([key, value]) => { if (value === targetValue) { console.log(`匹配到的键:${key},对应的值:${value}`); } }); }); } // 调用函数,查找值为"Fire"的键 printKeysByTargetValue(pokemonArray, "Fire");
这段代码的逻辑是:
- 用
forEach遍历数组中的每个对象 - 用
Object.entries()把对象转换成[键, 值]的数组形式 - 遍历这些键值对,当值等于目标值时,打印对应的键
如果需要处理更复杂的匹配(比如部分匹配、数字匹配),只需要修改if条件里的判断逻辑即可。
问题2:找出所有next_evolution包含指定名称的宝可梦
你的思路是对的,但有一个关键问题:数据集中的next_evolution是对象数组,每个元素都包含num和name字段,而不是字符串数组,所以直接用includes(nameOfPokemon)是无法匹配的。
我帮你修正了代码,同时优化了遍历方式(推荐用forEach替代for...in遍历数组,避免拿到原型链上的额外属性):
const infoOfPokemon = function(nameOfPokemon, allPokemon) { // 用于存储所有符合条件的宝可梦 const matchingPokemons = []; allPokemon.forEach(pokemon => { // 先判断当前宝可梦是否有next_evolution,并且是数组类型 if (pokemon.next_evolution && Array.isArray(pokemon.next_evolution)) { // 检查next_evolution数组中是否存在name等于目标名称的项 const hasTargetEvolution = pokemon.next_evolution.some(evolution => { return evolution.name === nameOfPokemon; }); if (hasTargetEvolution) { matchingPokemons.push(pokemon); console.log(`找到进化目标为${nameOfPokemon}的宝可梦:${pokemon.name}`); } } }); // 返回结果数组,方便后续使用 return matchingPokemons; };
这段代码的核心改进点:
- 用
Array.isArray()确保next_evolution是数组,避免报错 - 用
some()方法遍历next_evolution数组,检查是否有对象的name属性等于目标名称 - 收集所有符合条件的宝可梦到数组中,方便后续处理(而不只是打印)
比如调用infoOfPokemon("Ivysaur", pokedexData),就会找出所有能进化成妙蛙草的宝可梦(也就是妙蛙种子)。
内容的提问来源于stack exchange,提问作者Sm Ashhar
相关产品推荐
相关产品推荐

