我试图弄清楚是否有可能使用字符串作为路径更新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/
答案 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。但这是一般的想法。
答案 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);
}