我试图在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]);
答案 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);