我编写的解决方案正按预期工作,但以下是我的功能:
const dataExtraction = () => {
const { id, name, sprites, types } = data;
const pokemonType= types[0].type.name;
const { front_default } = sprites;
const animated= sprites.versions['generation-v']['black-white'].animated.front_default;
return {
id, //6
name, //charizard
pokemonType, //fire
front_default, //image url
aniamted //image url
}
}下面有JSON有效负载,并且提取了我想要使用的数据。我遵循了一种非常标准的方法来导航到嵌套对象,但是如果有更好的解决方案或更简洁的方法来编写上面的函数,我想征求人们的意见:
发布于 2022-05-06 11:03:21
function extractData (json) {
return {
id: json.id,
name: json.name,
pokemonType: json.types[0].type.name,
front_default: json.sprites.front_default,
animated: json.sprites.versions['generation-v']['black-white'].animated.front_default
};
}发布于 2022-05-06 12:28:40
超短的评论;
data似乎是一个具有超级泛型名称的全局变量,这是个坏主意<verb><subject>,所以可能是extractData,甚至是extractPokemon?const和评论我正准备写一个反例,但理查德·N处理了这个问题。
发布于 2022-05-06 15:38:27
当像这样处理JSON时,深度查找带来的脆弱性会使我的脊柱颤抖--我觉得它很容易出错,因为如果数据或数据形状发生了变化,例如undefined或null在链中的某个位置,这段代码就会崩溃。
我建议您使用经过良好测试的库方法(如get ),而不是建议使用可以工作的try/catch方法。
然后您将有一些更健壮的东西,如下所示:
import { get } from 'lodash';
const mapJsonToPokemonItem = (data) => ({
id: get(data, 'id'),
name: get(data, 'name'),
pokemonType: get(data, 'types[0].type.name'),
front_default: get(data, 'sprites.front_default'),
animated: get(data, "sprites.versions['generation-v']['black-white'].animated.front_default"),
});请注意以下事项:
mapJsonToPokemonItem。data作为参数,以避免对此变量的外部范围的依赖。=> ({})语法的对象,因为除了映射之外,在函数中不需要执行。get调用提供一个默认值,例如:get(object, 'a.b.c', 'default'),这可能对回退图像很有用,等等。https://codereview.stackexchange.com/questions/276349
复制相似问题