javascript - 当对象属性未定义时默认为一个值

标签 javascript

我有一个对象(从 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/

相关文章:

javascript - 在 Meteor 1.3+ 中使用异步

javascript - 日期选择器中的 Angular 本地引用问题

javascript - 将数据发送到 firebase 并返回到 index.html

javascript - 如何链接返回 promise 或值的函数?

javascript - 如何使用 HTML5 使某些元素可拖动和其他可放置?

javascript - React js css类背景图片不可见

javascript - 我如何在angular js中使用带有指令的ng-model

javascript - 使用 CORS JavaScript src 属性 html5 访问 Icecast 流

javascript - 状态正在更新到组件,但 props 未定义

javascript - 状态更改后,React-Redux 连接的组件不会更新