测试嵌套的JavaScript对象键是否存在。
测试嵌套的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); }
但我想知道是否有更好的方法。
嵌套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库提供的方法来解决,也可以自行实现相应的函数来判断键是否存在。这些方法可以大大简化处理嵌套对象时的操作,并提高代码的可读性和可维护性。
测试嵌套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对象键的存在性是一个常见的问题。使用简洁的语法可以简化代码,但也可能降低可读性。根据实际情况,我们可以选择不同的解决方案,权衡代码的可读性和性能。
原因:在访问嵌套的JavaScript对象键时,如果其中一个成员是null或undefined,尝试访问成员时会抛出异常。为了避免这个TypeError异常,需要逐级进行访问并检查每一级的存在性。
解决方法:可以使用一个函数来测试多个级别的存在性。根据给定的参数依次访问每一级,并检查每一级是否存在。如果不存在,则返回false;如果存在,则继续向下访问。最终返回true表示所有级别都存在。
ES6更新:可以使用ES6的特性和递归来简化原始函数。如果想要获取嵌套属性的值而不仅仅是检查其存在性,可以使用一个简单的一行函数来实现。
此外,还有一个关于使用可选链操作符的更新。可选链操作符是ECMAScript 2020中的一个新特性,它可以安全地访问深层嵌套的属性。如果访问的任何一级是null或undefined,表达式本身将解析为undefined。此特性还允许安全地处理方法调用。
以上函数和特性提供了在访问嵌套JavaScript对象键时进行存在性检查和获取嵌套属性值的解决方案。