检查嵌套对象中是否存在对象成员

IT技术 javascript object
2021-02-09 19:46:28

有没有比使用___ in object检查对象的每个级别的存在来检查单个成员的存在更简单的方法

更简洁:如何检查someObject.member.member.member.value 是否存在?

6个回答

通常,您可以使用if(property in object),但这对于嵌套成员来说仍然很麻烦。

你可以写一个函数:

function test(obj, prop) {
    var parts = prop.split('.');
    for(var i = 0, l = parts.length; i < l; i++) {
        var part = parts[i];
        if(obj !== null && typeof obj === "object" && part in obj) {
            obj = obj[part];
        }
        else {
            return false;
        }
    }
    return true;
}

test(someObject, 'member.member.member.value');

演示

@JustcallmeDrago:他的可能更快。但是你会遇到最后一个值的问题。他的代码的结果是undefined最后一个属性的值。如果设置为undefined则无法区分。但是假设你从来没有设置过这样的值,它应该是保存。老实说,我发现它有点难以阅读,如果你想使其可重用,你会再次使用循环......但两者都可以。
2021-03-17 19:46:28
@JustcallmeDrago:是的……虽然对于数组来说没有那么重要,但是对于null. 因此,最好也添加对 null 的检查。我添加了测试,因为'value' in <primitive type>会抛出错误。添加了null测试。
2021-03-20 19:46:28
@Felix:我明白了。我真的很喜欢字符串作为参数,但也喜欢帕特里克回答的简单性。他的和你的一样安全吗?有那么快吗?
2021-03-24 19:46:28
看起来挺好的。我喜欢循环方法,但是typeof obj === "object"到底有什么帮助呢?typeof 不是也可以为 null 和 array 返回对象吗?
2021-04-07 19:46:28
抱歉打断一下,但是......这里有人提到“帕特里克的回答”更快。呃……这个答案在哪里?:-?
2021-04-14 19:46:28

您也可以尝试/捕获 TypeError?

try {
  console.log(someObject.member.member.member.value);
} catch(e) {
  if (e instanceof TypeError) {
    console.log("Couldn't access someObject.member.member.member.value");
    console.log(someObject);
  }
}

这是一种方法:http : //jsfiddle.net/9McHq/

var result = ((((someObject || {}).member || {}).member || {}).member || {}).value;

alert( result );
好的。当然,这可以很容易地变成递归函数!
2021-04-10 19:46:28
if (someObject.member && someObject.member.member &&
    someObject.member.member.member && someObject.member.member.member.value) ...

或类似:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value;

如果任何特定值碰巧是nullfalse0""(空字符串),这将不会“工作” ,但除了最终值可能是例外,这似乎不太可能。

另请注意,这typeof ____ !== "undefined"不是查看对象是否具有属性的正确测试。相反,您应该使用___ in object,例如if ("member" in someObject)这是因为您可以将属性设置为 的显式值undefined,这与使用 删除它不同delete someObject.member