在未定义对象属性时默认为值

时间:2018-05-11 20:28:10

标签: 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:无法读取null

的属性'file'

换句话说,缺少图像文件,因此未定义文件属性。无论链中的哪个属性丢失,我有没有办法默认为undefined?

我应该使用try / catch吗?

1 个答案:

答案 0 :(得分:1)

不是干净的本地方式。您需要完全undefined检查。你应该考虑lodash impliments _.get()。它包含了进行undefined检查的逻辑。因此,如果您发现自己经常进行这些深度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>
&#13;
&#13;
&#13;