JavaScript - 检查对象参数是否为未定义

4

我有一个类似于这个问题的情况:JavaScript检查对象属性是否存在,即使对象未定义

我的问题是,如果您有一系列的属性,会发生什么。例如:

var obj = {'a': {'b': {'c': {'d': 'I exists'}}}}

我需要检查变量'd'是否已定义。为了避免出现错误,我需要这样检查:

if (typeof obj != 'undefined' && typeof obj['a'] != 'undefined' && typeof obj['a']['b'] != 'undefined' && typeof obj['a']['b']['c'] != 'undefined' && typeof obj['a']['b']['c']['d'] != 'undefined')

您可以看到这可能会让人感到困扰。例如,将其推展到嵌套层数为999的元素。有没有什么方法可以摆脱前n-1个条件?


你可以将 obj.a.b.c.d !== 'undefined' 语句放在一个 try ... catch 块中。就像这个例子一样。 - Phylogenesis
6个回答

4

使用try-catch语句的解决方案:

var check = function(obj) {
  try {
    return (typeof obj.a.b.c.d !== 'undefined');
  } catch (e) {
    return false;
  }
};

alert(check({
  'a': {
    'b': {
      'c': {
        'd': 'I exists'
      }
    }
  }
}));


1

正如Tushar在他的回答中所说:

您无法摆脱前面的n-1个条件

因此,您只需缩短语句,使其不那么冗长。

请查看我创建的以下示例:

JSFIDDLE EXAMPLE

var obj = {'a': {'b': {'c': {'d': 'I exists'}}}};

for (var key in obj)
{
    if (obj && obj.a.b.c.d) 
    { 
        console.log(obj.a.b.c.d);
    }
}

1

你可以像这样尝试:

function checkUndefined(obj) {
  var x = Array.prototype.slice.call(arguments, 1);
  for (var i = 0; i < x.length; i++) {
    if (!obj || !obj.hasOwnProperty(x[i])) {
      return false;
    }
    obj = obj[x[i]];
  }
  return true;
}

在考虑类似的事情,希望我不需要它 :)。 - zozo
你也可以尝试使用Tushar的答案。 - Rahul Tripathi
没错,我点了赞,但这只是在一定程度上简化了问题...一个对象解析可以解决它。 - zozo

1

你可以按照以下方式检查真值。

你无法摆脱前n-1个条件,但可以缩短语句。

if (obj && obj.a && obj.a.b && obj.a.b.c && typeof obj.a.b.c.d !== 'undefined')
    // Use of obj.a.b.c.d is considered safe here

0
尝试编写自己的属性检查器,如下所示:
JavaScript:
function test(object) {
    var restOfKeys = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        restOfKeys[_i - 1] = arguments[_i];
    }
    var propertyToTest;
    if (object === undefined || !restOfKeys.length) {
        return false;
    }
    propertyToTest = restOfKeys.shift();
    if (restOfKeys.length) {
        return test.apply(void 0, [object[propertyToTest]].concat(restOfKeys));
    }
    return object[propertyToTest] !== undefined;
}
var toTest = { a: { b: { c: "asd" } } };
alert(test(toTest, "a", "b", "c"));

TypeScript:

function test(object: any, ...restOfKeys: string[]) {
    let propertyToTest: string;

    if (object === undefined || !restOfKeys.length) {
        return false;
    }

    propertyToTest = restOfKeys.shift();

    if (restOfKeys.length) {
        return test(object[propertyToTest], ...restOfKeys);
    }

    return object[propertyToTest] !== undefined;
}


var toTest = { a: { b: { c: "asd" } } };

alert(test(toTest, "a", "b", "c"));

源代码 在这里


0

var obj = {a:undefined,b:undefined,c:undefined,d:'I exists'};
  if(typeof obj['a'] === 'object'){alert(typeof obj['a']);}
  else if(typeof obj['b'] === 'object'){alert(typeof obj['b']);}
  else if(typeof obj['c'] === 'object'){alert(typeof obj['c']);}
  else{alert(typeof obj['d']+' : '+obj['d']);}

请到http://www.w3schools.com/js/js_datatypes.asp查看数据类型, 并到http://www.w3schools.com/js/js_arrays.asp查看数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接