我有一个对象(从 graphQl 查询返回),我正在迭代该对象,以便在使用数据之前使数据结构更简单。数据模型中有一些非必填字段,当数据存在时我想使用它,当数据不存在时默认为未定义。
这是我当前的功能:
const parseNovice = data => {
return data.allContentfulNovica.edges.map(edge => {
return {
createdAt: edge.node.createdAt,
id: edge.node.id,
slika: edge.node.slika.file.url || undefined,
tekst: edge.node.tekst.tekst || undefined,
naslov: edge.node.naslov
};
});
};
我收到的错误是:
TypeError: Cannot read property 'file' of null
换句话说,图像文件丢失,因此文件属性未定义。有没有办法让我默认为未定义,无论链中缺少哪个属性?
我应该为此使用 try/catch 吗?
最佳答案
不是以干净的 native 方式。您需要从头到尾进行 undefined
检查。您应该考虑 lodash 如何实现 _.get()
。它包装了执行 undefined
检查的逻辑。因此,如果您发现自己经常进行这些深入的未定义
检查,您可能需要考虑使用它或编写自己的实用函数。
否则你必须写这样的东西:
let edge;
let thing = {
prop: edge !== undefined && edge.node !== undefined && edge.node.tekst !== undefined && edge.node.tekst.tekst !== undefined ? edge.node.tekst.tekst : undefined,
prop2: _.get(edge, "node.tekst.tekst")
}
console.log(thing); // undefined
edge = {
node: {
tekst: {
tekst: "foo"
}
}
};
thing = {
prop: edge !== undefined && edge.node !== undefined && edge.node.tekst !== undefined && edge.node.tekst.tekst !== undefined ? edge.node.tekst.tekst : undefined,
prop2: _.get(edge, "node.tekst.tekst")
}
console.log(thing); // foo
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
关于javascript - 当对象属性未定义时默认为一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50299818/