在不知道任何键的情况下迭代整个JSON对象

时间:2016-10-02 23:35:37

标签: javascript jquery json web

我试图在JSON数据上执行操作(更新值,删除密钥,添加密钥等),我对此一无所知。这些项本质上是属性文件,而不是从应用程序返回的JSON数据。这些文件可能非常不同,我需要开发一种方法,可以在不了解JSON数据的情况下执行这些操作。

我正在跟踪密钥存储位置的路径。如果我有如下所示的样本数据,我会存储路径,如' / key1 / innerKey5 /'并使用getNodeData获取关键innerKey6的数据。

如果我有项目的路径和密钥,如何以编程方式在JSON数据中找到此项目并删除或更新项目?

var originalData = someMethodToGetJSONData();
var currentData; // Global variable storing a copy of the original data which can be modified

json = {
  "key1": {
    "innerKey1": {
      "innerKey2" : {
        "innerKey3": "value1",
        "innerKey4": "value2"
      }
    },
    "innerKey5": {
      "innerKey6": "value1"
    }
  },
  "key2": "value3",
  "key3": "value4"
}

function getKeysFromPath(keyPath) {
  var split = keyPath.split('/');
  var keys = [];

  for(var i = 0; i < split.length; i++) {
    if(split[i] != '') {
      keys.push(split[i]);
    }
  }

  return keys
}

function getNodeData(keyPath) {
  var keys = getKeysFromPath(keyPath);
  nodeData = currentItemData;

  for(var i = 0; i < keys.length; i++) {
    nodeData = nodeData[keys[i]];
  }

  return nodeData;
}

data = getNodeData('/key1/innerKey5/');
key = 'innerKey6';
console.log('Data: ' + data[key]);

6 个答案:

答案 0 :(得分:1)

这是如何迭代未知密钥的示例

var key;

for (key in arr) {
  if (arr.hasOwnProperty(key)) {
    console.log(key);
    console.log(arr[key]);
  }
}

答案 1 :(得分:0)

如果您使用的是JQuery,请使用.each()函数:

$.each(json,function(key,val){
        //You may use key/val for every iteration
});

答案 2 :(得分:0)

要更新或删除,您需要获取父对象和最后一个键:

var lastKey = keys.pop();
var parentObj = getNodeByKeys(keys); // refactor your code to make this function
parentObj[lastKey] = newValue;
delete parentObj[lastKey];

答案 3 :(得分:0)

Lodash在做这类事情方面有一些有用的功能。

_。get,_. set,_.unset

因此,如果您将节点存储为字符串形式,例如。 - &GT; a.b.c [0] .k,这3个函数应该能够做你想做的事。

答案 4 :(得分:0)

通过XHR获取数据并解析JSON:

var getJSON = function(url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open('get', url, true);
        xhr.onload = function() {
            var status = xhr.status;
            if (status == 200) {
                resolve(JSON.parse(xhr.response));
            } else {
                reject(status);
            }
        };
        xhr.send();
    });
};

然后使用jQuery each

getJSON('//yoursite.com/yourfile.json').then(function(data) {
    $.each(data, function(k, v) {
      console.log(k + ', ' + v);
    });
}, function(status) {
    console.log(status);
});

答案 5 :(得分:0)

您可以使用此功能从“路径”获取数据:

/**
 * Get a node from an object according to the given path.
 * @param {String} path Node's path.
 * @param {Object} data Object to retrieve the desired information.
 * @returns {Object} Returns the value from the node, or null in the
 * case the node is not found.
 */
function getNode(path, data)
{
    var currentNode = data;

    path.replace(/^\/|\/$/g, '').split('/').forEach(function(key){
        if(key in currentNode)
        {
            currentNode = currentNode[key];
        }
        else
        {
            currentNode = null;
            return false;
        }
    });

    return currentNode;
}

从那里你可以像这样操纵你的对象:

var myData = {
    "key1": {
        "innerKey1": {
            "innerKey2" : {
                "innerKey3": "value1",
                "innerKey4": "value2"
            }
        },
        "innerKey5": {
            "innerKey6": "value1"
        }
    },
    "key2": "value3",
    "key3": "value4"
};

var someNode = getNode('/key1/innerKey5', myData);

// add value
someNode.innerKey7 = 'newValue';

// update existing value
someNode.innerKey7 = 'otherValue';

// delete value
delete someNode.innerKey6;

console.log(myData);