javascript - 根据数组长度遍历 JSON

标签 javascript jquery json for-loop

假设我有一个 json

jsonData = {
   "id":"dfd",
   "properties":{
      "Pri":"2",
      "Brief Description":"asdf",
      "Description":"",
      "tree":{
        "var": "2",
        "rav": "3"
      }
    }   
}

和一个列表

var variableArray = ['properties', 'tree', 'var'];

如果我想访问 var 的值并对其进行编辑。我该如何在保持 jsonData 值的同时做到这一点?

我已经尝试过

for (var i = 0; i < variableArray.length; i++) {
  jsonData = jsonData[variableArray[i]];
}
jsonData = 'new value';

但我无法再访问整个 jsonData。

有哪些方法可以实现这一点?

最佳答案

JavaScript 没有对属性的引用,而这实际上正是您尝试使用的属性。

相反,您可以为自己提供一个方法来遍历对象并检索或分配其中的属性。这是 ES5 及更早版本中的快速和肮脏的:

function accessPath(obj, path, value) {
    var o = obj;
    var i = 0;
    var last = path.length - 1;
    while (i < last) {
       o = o[path[i]];
       ++i;
    }
    if (arguments.length < 3) {
        // Getting
        return o[path[last]];
    } else {
        // Setting
        return o[path[last]] = value;
    }
}

实例:

function accessPath(obj, path, value) {
    var o = obj;
    var i = 0;
    var last = path.length - 1;
    while (i < last) {
       o = o[path[i]];
       ++i;
    }
    if (arguments.length < 3) {
        // Getting
        return o[path[last]];
    } else {
        // Setting
        return o[path[last]] = value;
    }
}

var data = {
   "id":"dfd",
   "properties":{
      "Pri":"2",
      "Brief Description":"asdf",
      "Description":"",
      "tree":{
        "var": "2",
        "rav": "3"
      }
    }   
}

var path = ['properties', 'tree', 'var'];

console.log("Existing: " + accessPath(data, path));
accessPath(data, path, "new value");
console.log("Updated: " + accessPath(data, path));
console.log("Confirm: " + data.properties.tree.var);

在 ES2015+ 中看起来非常相似,除了检查是否提供了 value 的方式。

不太漂亮,但相当有效。

实际上,如果我们返回一个带有 getter 和 setter 的对象,我们可以更进一步,这看起来有点像属性引用,尽管实际上并非如此:

function makeAccessor(obj, path) {
    var o = obj;
    var i = 0;
    var last = path.length - 1;
    var lastName = path[last];
    while (i < last) {
       o = o[path[i]];
       ++i;
    }
    return {
        get value() {
            return o[lastName];
        },
        set value(value) {
            o[lastName] = value;
        }
    };
}

然后,获取访问器:

var accessor = makeAccessor(data, path);

并使用它:

console.log(accessor.value);
accessor.value = "new value";

function makeAccessor(obj, path) {
    var o = obj;
    var i = 0;
    var last = path.length - 1;
    var lastName = path[last];
    while (i < last) {
       o = o[path[i]];
       ++i;
    }
    return {
        get value() {
            return o[lastName];
        },
        set value(value) {
            o[lastName] = value;
        }
    };
}

var data = {
   "id":"dfd",
   "properties":{
      "Pri":"2",
      "Brief Description":"asdf",
      "Description":"",
      "tree":{
        "var": "2",
        "rav": "3"
      }
    }   
}

var path = ['properties', 'tree', 'var'];

var accessor = makeAccessor(data, path);

console.log("Existing: " + accessor.value);
accessor.value = "new value";
console.log("Updated: " + accessor.value);
console.log("Confirm: " + data.properties.tree.var);

关于javascript - 根据数组长度遍历 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45040997/

相关文章:

问题

javascript - 如何自动检查PDF中某个组的特定单选按钮?

javascript - 在 Coffeescript 中自定义自动完成下拉菜单

javascript - 多级 Bootstrap 下拉列表的问题

jquery 二维 JSON

javascript - 连接字符串的最简单方法,并对最后一个条目进行特殊处理

javascript - 如何在开发模式下减少 webpack 捆绑?

javascript - 设置 div 的高度但保持流畅

javascript - 从 http 处理程序返回的 JSON 在 IE8 中为 null,但在 IE10 或 Chrome 中则不然

函数返回的Javascript(node.js)值未定义?