【问题标题】:Javascript access and write object sub-value through array of successive keys [duplicate]Javascript通过连续键数组访问和写入对象子值[重复]
【发布时间】:2015-08-28 22:22:34
【问题描述】:

我怎样才能得到像这样工作的方法getValueThroughPath(object, keysArray)

var object = {
  key1: {
    key2: {
      key3: {
        key4: "value"
      }  
    }
  }
}

getValueThroughPath(object, ['key1', 'key2', 'key3', 'key4']); // = "value" and undefined if wrong path

?

我也在寻找setValueThroughPath(object, keysArray)的等效方法。

如果这可以缩短解决方案,我使用Lodash

【问题讨论】:

  • 使用括号表示法
  • _.get(object, ['key1', 'key2', 'key3', 'key4']); 怎么样?

标签: javascript


【解决方案1】:

这将使对象向下移动到最后一个键。如果任何键拼写错误或丢失,它将返回undefined

function getValueThroughPath(obj, keys) {
  while(obj=obj[keys.shift()] || '', keys.length);
  return obj || undefined;
}

function setValueThroughPath(obj, keys, val) {
  while(keys.length>1) {
    obj[keys[0]]= obj[keys[0]] || {};
    obj= obj[keys.shift()];
  };
  obj[keys[0]]= val;
}

var object = {
  key1: {
    key2: {
      key3: {
        key4: "value"
      }  
    }
  }
}

setValueThroughPath(object, ['this', 'is', 'a', 'test'], 'Eureka!');
setValueThroughPath(object, ['this', 'is', 'a', 'new', 'test'], 'Hallelujah!');

console.log(getValueThroughPath(object, ['key1', 'key2', 'key3', 'key4']));   // "value"
console.log(getValueThroughPath(object, ['key1', 'key2', 'key5', 'key4']));   // undefined
console.log(getValueThroughPath(object, ['this', 'is', 'a', 'test']));        // "Eureka!"
console.log(getValueThroughPath(object, ['this', 'is', 'a', 'new', 'test'])); // "Hallelujah!"

【讨论】:

  • 这是比重复的答案更优雅的解决方案。 :)
  • 谢谢,刚刚注意到您的setValueThroughPath 请求。现已添加。
【解决方案2】:

您可以遍历对象属性并使用如下函数获取适当的值:

function getValueThroughPath(object, keys) {
    var temp = object;
    for (var i = 0; i < keys.length; i++) {
        var key = keys[i];
        if (temp.hasOwnProperty(key)) {
            temp = temp[key];
            console.log(JSON.stringify(temp));
        } else {
            console.log('Couldnt find key ' + key);
            return undefined;
        }
    }

    return temp;
}

您可以在http://jsfiddle.net/bx82akj5/ 上查看小提琴以查看它是否正常工作(打开控制台查看!=D)

我使用了“hasOwnProperty”方法,因此您最终不会在 javascript 中访问不存在的属性或访问 Object 的属性,因此您只需遍历对象中定义的属性。

您正在寻找的函数 setValueTrhoughPath 几乎相同(当然只是类比)

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2019-11-18
    • 2023-04-08
    相关资源
    最近更新 更多