从字符串路径动态更新JavaScript对象

时间:2013-02-26 15:27:55

标签: javascript object path

我试图弄清楚是否有可能使用字符串作为路径更新JavaScript对象。

在下面的示例中,我试图找出如何使用更新第一本书的价格 store>book>0>price作为我的道路。

我知道我可以通过编写data['store']['book'][0]['price']来访问它,但我需要能够动态地执行此操作。我尝试过一些东西,但没有运气。任何想法?

这需要适用于任何深度,而不是固定的深度


数据:

 var data = { 
      "store": {
        "book": [ 
          { "category": "reference",
            "author": "Nigel Rees",
            "title": "Sayings of the Century",
            "price": 8.95
          },
          { "category": "fiction",
            "author": "Evelyn Waugh",
            "title": "Sword of Honour",
            "price": 12.99
          }
        ],
        "bicycle": {
          "color": "red",
          "price": 19.95
        }
      }
    }
var path = "store>book>0>price"

功能:

function updateObject(object, path, data) {
    var pathArray = path.split(">");
    // Some code here
} 
updateObject(data, path, "10.00");

更新

正如费利克斯指出的那样,答案可以在这里找到。 Dynamic deep setting for a JavaScript object

这是我的方案的一个工作示例 http://jsfiddle.net/blowsie/Sq8j3/9/

4 个答案:

答案 0 :(得分:18)

function updateObject(object, newValue, path){

  var stack = path.split('>');

  while(stack.length>1){
    object = object[stack.shift()];
  }

  object[stack.shift()] = newValue;

}

答案 1 :(得分:2)

您希望更新方法签名以接受您正在修改的:对象,路径字符串以及您分配给最终路径属性的值。

function updateObject(data, path, value) {
        var pathArray = path.split(">");
        var pointer = data; // points to the current nested object
        for (var i = 0, len = pathArray.length; i < len; i++) {
            var path = pathArray[i];
            if (pointer.hasOwnProperty(path)) {
                if (i === len - 1) { // terminating condition
                    pointer[path] = value;
                } else {
                    pointer = pointer[path];
                }
            } else {
                // throw error or terminate. The path is incorrect
            }
        }
    }

或递归。或者使用while loop。但这是一般的想法。

小提琴:http://jsfiddle.net/Sq8j3/8/

答案 2 :(得分:1)

您调用对象data稍微有点混乱,但data也是您函数的参数。因此,我已将参数的名称更改为newVal以清除此潜在问题。

这循环遍历路径并不断重置一个名为e的变量,该变量通常指向data对象,并在循环时变得更具体。最后,您应该几乎引用确切的属性 - 我们使用路径的最后部分来设置新值。

function updateObject(newVal, path) {
    var pathArray = path.split(">"),
        i = 0,
        p = pathArray.length - 1, // one short of the full path
        e = data; // "import" object for changing (i.e., create local ref to it)
    for (i; i < p; i += 1) { // loop through path
        if (e.hasOwnProperty(pathArray[i])) { // check property exists
            e = e[pathArray[i]]; // update e reference point
        }
    }
    e[pathArray[i]] = newVal; // change the property at the location specified by path to the new value
};

您可能需要添加一些内容来捕获错误。我已经通过hasOwnProperty()电话进行了检查,但您可能需要更详细的内容。

<强>更新

之前在代码中犯了一个愚蠢的错误,但它现在应该正常工作。证明here

答案 3 :(得分:0)

重构Accessing nested JavaScript objects with string key

我得到了

var path = "store>book>0>price"
Object.byString = function(o, s) {
    var a = s.split('>');
    while (a.length) {
        var n = a.shift();
        if (n in o) {
            o = o[n];
        } else {
            return;
        }
    }
    return o;
}


function updateObject(data, path) {
  object2update= Object.byString(data, path);
}