javascript - 在 Javascript 中获取/设置对象深层属性的最佳方法是什么?

标签 javascript object properties

从对象中获取更深层次的属性是出了名的烦人。如果父项不存在,则会出现错误。因此,当 parent 不存在时,您需要停止访问该属性(property)。

最笨的方法是:

if (parent.value && parent.value.subvalue && parent.value.subvalue.targetvalue)
    var myVal = parent.value.subvalue.targetvalue;
else
    var myVal = null;

当你需要经常获取一个属性时,这是行不通的,你需要一个快捷函数。首先我做了这样的事情:

function getProp(path) {
    try {
        return eval(path);
    }
    catch (e) {
        return null;
    }
};
// getProp('parent.value.subvalue.targetvalue');

但这至少有两个原因很蹩脚:对象必须在范围内,而且没有人喜欢使用 eval()

所以也许将对象应用于函数会更好:

function getProp(path, parent) {
    path = path.split('.');

    var val = parent;

    for (var k = 0; k < path.length; k++) {
        var key = path[k];

        try {
            val = val[key];
        }
        catch (e) {
            return null;
        }
    }

    return val;
};
// getProp('value.subvalue.targetvalue', parent);

但不知何故,它仍然感觉不对。
你怎么做到这一点?什么是最佳实践?

设置一个父对象可能存在也可能不存在的对象深层属性更烦人。

parent = parent || {};
parent.value = parent.value || {};
parent.value.subvalue = parent.value.subvalue || {};
parent.value.subvalue.target = "YAY SOME VALUE!"

你会如何很好地解决这个问题?

是否有用于此的 javascript native 函数,因为这需要经常完成?

最佳答案

内置方式,不。如果你在 Node.js 平台上,你可以尝试一些像 dotty 这样的包.

无论如何,我认为你可以这样做的方式有点像这样(我还没有测试过!但我认为它可以工作):

key.split( "." ).reduce(function( memo, part ) {
   if ( typeof memo !== "object" || memo[ part ] === undefined ) {
      return;
   }

   return memo[ part ];
}, obj );

关于javascript - 在 Javascript 中获取/设置对象深层属性的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19718545/

相关文章:

javascript - 无法在 FabricJS 中将图像置于最前面

javascript - jQuery 和 Javascript - 通过对象的属性缓慢循环

javascript - 从 onload 事件调用对象函数会使其失去上下文

javascript - 我如何访问对象的属性

swift - 属性 getter 和 setter

javascript - 在 jquery 中显示循环 <div> 标签

javascript - 向文本区域添加水印

javascript - Chart.js 中 x 轴上的双标签

java - 如何使用 JVMTI 获取 java 对象的内存地址(不是哈希码)

java - 在 Spring Boot 中加载 Spring 属性