2016-10-02 85 views
3

我试图对JSON数据执行操作(更新值,删除键,添加键等),这些我都不知道。这些项目实际上是属性文件,而不是从应用程序返回的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]); 
+1

忌讳:JSON对象只有两个属性:'parse'和'stringify'。你有一个* JavaScript对象*,或者只是一个*对象*,而不是一个JSON对象。 – Amadan

+0

看看使用[Object.keys()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) – charlietfl

+0

@Amadan你是对的,谢谢。 –

回答

0

Lodash对做这类事情有一些有用的功能。

_.get,_.set,_.unset

所以,如果要存储节点串形式,例如。 - > a.b.c [0] .k,这3个函数应该可以做你想做的。

+0

这看起来是最快最简单的选择。谢谢。 –

0

如果您在使用jQuery使用。每个()函数:

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

为了更新或删除,则需要获得父对象和最后的关键:

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

这是如何通过未知键迭代

var key; 

for (key in arr) { 
    if (arr.hasOwnProperty(key)) { 
    console.log(key); 
    console.log(arr[key]); 
    } 
} 
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); 
}); 
+0

如果你打算抛出jQuery来使用'each',为什么不使用'$ .getJSON'呢? – charlietfl

+0

是的。我发现原生的JS XHR很容易跨界浏览(wES6 shim),但发现在本地JS中迭代对象并不平凡。所以'$ .each'很容易跨浏览器。我的首选是原生JS,就是这样。 –

+0

在原生JS中你可以这样做:'Object.keys(json).forEach(function(key){});'。几乎和jQuery一样。 –

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); 
相关问题