测试嵌套的JavaScript对象键是否存在。

13 浏览
0 Comments

测试嵌套的JavaScript对象键是否存在。

如果我有一个对象的引用:

var test = {};

该对象可能(但不是立即)具有嵌套对象,类似于:

{level1: {level2: {level3: "level3"}}};

如何最好地检查深层嵌套对象中属性的存在?

alert(test.level1);返回undefined,但alert(test.level1.level2.level3);会失败。

我目前正在像这样做:

if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
    alert(test.level1.level2.level3);
}

但我想知道是否有更好的方法。

0
0 Comments

嵌套JavaScript对象键存在性测试的问题是指如何判断嵌套对象中的键是否存在。这个问题的出现可能是因为在处理嵌套对象时,需要判断某个特定的键是否存在,但是JavaScript本身并没有提供直接的方法来进行判断。

解决这个问题的方法有多种途径。一种常用的方法是使用lodash库,该库提供了一个名为_.get的方法,可以用来获取嵌套对象中的属性值。示例代码如下:

_.get(countries, 'greece.sparta.playwright')

另外,lodash.contrib库也提供了一些方法来解决这个问题,其中之一是_.getPath方法。该方法可以根据给定的键路径来获取嵌套对象中的属性值。示例代码如下:

_.getPath(countries, "greece.athens.playwright");
// => "Sophocles"
_.getPath(countries, "greece.sparta.playwright");
// => undefined
_.getPath(countries, ["greece", "athens", "playwright"]);
// => "Sophocles"
_.getPath(countries, ["greece", "sparta", "playwright"]);
// => undefined

此外,我们也可以自行实现一个isPathDefined函数来判断嵌套对象中的键是否存在。示例代码如下:

function isPathDefined(object, path) {
  return typeof _.getPath(object, path) !== 'undefined';
}

另外,lodash库本身也提供了类似的功能,例如_.has方法可以判断嵌套对象中的键是否存在。示例代码如下:

_.has(countries, 'greece.spart.playwright') // => false

对于需要判断多个不同路径的情况,我们可以考虑使用_.get方法的多次调用来获取属性值。示例代码如下:

var url = _.get(e, 'currentTarget.myurl', null) || _.get(e, 'currentTarget.attributes.myurl.nodeValue', null) || null

此外,还可以考虑使用_.set方法来设置嵌套对象中的属性值,该方法可以接受一个默认初始值作为参数。例如:

_.set(obj, "prop1.prop2.prop3", "value", defaultInitialvalue);

总之,对于嵌套JavaScript对象键存在性测试的问题,我们可以使用lodash库提供的方法来解决,也可以自行实现相应的函数来判断键是否存在。这些方法可以大大简化处理嵌套对象时的操作,并提高代码的可读性和可维护性。

0
0 Comments

测试嵌套JavaScript对象键的存在性是一个常见的问题。在JavaScript中,有时候我们需要检查一个嵌套对象的键是否存在,如果存在则继续往下查找,否则返回undefined。这个问题的出现原因是为了简洁地处理嵌套对象的键存在性检查,并避免创建临时变量。

Oliver Steele提出了一个解决方案,使用一种简洁的语法来检查嵌套对象键的存在性:

var level3 = (((test || {}).level1 || {}).level2 || {}).level3;
alert(level3);

这种语法虽然看起来有些复杂,但是一旦习惯了,其实并不难阅读。这种方法会依次检查每一层的键是否存在,直到找到目标键或返回undefined。

这种方法的优点在于简洁,避免了创建临时变量的开销。在绝大多数情况下,性能不会成为问题,只有在性能要求较高的情况下才需要进行性能优化。

然而,这种方法也存在一些缺点。有些人认为这种语法不易读,容易出现拼写错误,降低了代码的可读性。他们更倾向于使用传统的if语句来进行嵌套对象键的存在性检查:

if (test && test.level1 && test.level1.level2 && test.level1.level2.level3) {
  // do something
}

还有一些人提出了其他的解决方案,比如封装成函数来简化检查过程。例如,可以定义一个深层属性访问函数:

const deepProp = (o, props) => {
  return props.reduce((a, b) => {
    let k = (a || {})[b];
    a = k;
    return k;
  }, o);
}

使用这个函数可以更方便地进行嵌套对象键的存在性检查:

var level3 = deepProp(test, ['level1', 'level2', 'level3']);

总结起来,测试嵌套JavaScript对象键的存在性是一个常见的问题。使用简洁的语法可以简化代码,但也可能降低可读性。根据实际情况,我们可以选择不同的解决方案,权衡代码的可读性和性能。

0
0 Comments

原因:在访问嵌套的JavaScript对象键时,如果其中一个成员是null或undefined,尝试访问成员时会抛出异常。为了避免这个TypeError异常,需要逐级进行访问并检查每一级的存在性。

解决方法:可以使用一个函数来测试多个级别的存在性。根据给定的参数依次访问每一级,并检查每一级是否存在。如果不存在,则返回false;如果存在,则继续向下访问。最终返回true表示所有级别都存在。

ES6更新:可以使用ES6的特性和递归来简化原始函数。如果想要获取嵌套属性的值而不仅仅是检查其存在性,可以使用一个简单的一行函数来实现。

此外,还有一个关于使用可选链操作符的更新。可选链操作符是ECMAScript 2020中的一个新特性,它可以安全地访问深层嵌套的属性。如果访问的任何一级是null或undefined,表达式本身将解析为undefined。此特性还允许安全地处理方法调用。

以上函数和特性提供了在访问嵌套JavaScript对象键时进行存在性检查和获取嵌套属性值的解决方案。

0