我如何检查我的 JSON 字段是否已定义?
2020-02-09
74
我正在解析 JSON 并尝试访问它的一个字段,即数组。
const myObj: MyObj = JSON.parse(myJson);
console.log(myObj.myArray); //SyntaxError: Unexpected end of JSON input
console.log(myObj.myArray == 'undefined'); //SyntaxError: Unexpected end of JSON input
console.log(myObj.myArray.length); //TypeError: Cannot read property 'length' of undefined
console.log(myObj.myArray !== null); //true
我可以毫无问题地遍历我的数组并处理我需要的数据。但我需要检查以确保
myArray
字段在遍历时有效。当我尝试执行此操作时,我收到如上所示的错误。
我非常困惑。有人可以向我解释发生了什么以及如何解决它吗?
3个回答
使用
in
时要小心,因为它会搜索整个原型链。
const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);
console.log('constructor' in myObj); // true (BAD)
相反,请尝试使用
.hasOwnProperty()
,如下所示:
const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);
console.log(myObj.hasOwnProperty("a")); // true
console.log(myObj.hasOwnProperty("constructor")); // false
Oliver Ni
2020-02-09
如果您担心存在性,您可以简单地检查
if (myObj.myArray) {
如果您想确认存在并确认它是一个数组
if (myObj.myArray && Array.isArray(myObj.myArray) {
Joe
2020-02-09
您可以使用
in
运算符来检查对象原型链中是否指定了某个属性:
const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);
console.log('myArray' in myObj); // false
console.log('a' in myObj); // true
或者,您可以检查字段是否为
undefined
(如果是,则它不存在于
JSON.parse
返回的对象中),最安全的方法是使用
typeof
运算符:
const myJson = '{"a": 2}';
const myObj = JSON.parse(myJson);
console.log(typeof myObj.myArray !== 'undefined'); // false
console.log(typeof myObj.a !== 'undefined'); // true
直接与应避免使用
undefined
(例如
myObj.myArray !== undefined
),因为
undefined
可以被
覆盖或遮蔽
。
编辑
:正如@OliveNi 指出的那样,使用
in
运算符很危险,因为它会贯穿整个原型链。为了进行更安全的检查(作为
undefined
检查的替代),您可以使用
hasOwnProperty
,如
他的答案
中所示。
Alberto Trindade Tavares
2020-02-09