【问题标题】:What is the best way to get/set an objects deep property in Javascript?在 Javascript 中获取/设置对象深度属性的最佳方法是什么?
【发布时间】:2013-11-12 04:03:07
【问题描述】:

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

无能为力的方法是:

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 原生函数用于此,因为这需要经常执行?

【问题讨论】:

标签: javascript object properties


【解决方案1】:

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

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

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

   return memo[ part ];
}, obj );

【讨论】:

  • 巧妙使用reduce()。
【解决方案2】:

不用try..catch,只测试属性:

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

    for (var k=0, kLen=path.length; k<kLen; k++) {

        if (parent.hasOwnProperty(path[k])) {
            parent = parent[path[k]];

        } else {
          return; // undefined? null? error?
        }
    }
    return parent;
}

var obj = {a: {b: {c: 'C', d:'D'}}};

console.log(
  getProp('a.b.d', obj)  // D
);      

【讨论】:

  • 这是一个微不足道的变化,但看起来更好。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多