【问题标题】:Need to iterate through stored json objects in local storage array of json data需要遍历json数据本地存储数组中存储的json对象
【发布时间】:2013-10-03 02:17:28
【问题描述】:

我查看了Iterate through nested json object array 和其他一些帖子,但它们似乎并没有解释我的情况。

我在这里遇到的问题是,如果客户端的表单离线并需要将多个提交存储到本地存储中,我必须将多个 JSON 对象存储到一个数组中到本地存储;所以当重新建立连接时,它会遍历所有的localstorage数据,并将每个JSON对象分别提交到新的行到SQL DB中。

我所拥有的只是存储到本地存储数组中的 JSON 对象数组,但我似乎无法分别返回每个“{...}”对象,我只能使用 offlinExtractData 获取数组字符串的单个值[3](返回“cable_no”的“c”)而不是能够获取多个对象数组中的第一个 JSON 对象。

例如,将提交到 SQL DB 的完整 JSON 对象如下所示,然后通过 AJAX 发送到 PHP SQL 文件:

{"cable_no":"90012","section_no":"1","extract_ft":"1","cable_status":"","conduit_status":"None","extract_date":"2013- 09-26","extraction_team":" ","extract_notes":"1"}

这是一行数据,但这是我的本地存储在多次提交后的样子:

[{"cable_no":"90012","section_no":"1","extract_ft":"1","cable_status":"Done","conduit_status":"None","extract_date":"2013-09-26","extraction_team":" ","extract_notes":"1"},
{"cable_no":"90012","section_no":"1","extract_ft":"2","cable_status":"Done","conduit_status":"Liner 2","extract_date":"2013-09-26","extraction_team":"E1","extract_notes":"2"},
{"cable_no":"90012","section_no":"1","extract_ft":"3","cable_status":"Done","conduit_status":"Liner 2","extract_date":"2013-09-26","extraction_team":"Unknown","extract_notes":"3"},
{"cable_no":"90012","section_no":"4","extract_ft":"4","cable_status":"Done","conduit_status":"Liner 2","extract_date":"2013-09-26","extraction_team":"Unknown","extract_notes":"4"},
{"cable_no":"90012","section_no":"1.2.3","extract_ft":"333","cable_status":"Done","conduit_status":"Liner 2","extract_date":"2013-09-26","extraction_team":"Unknown","extract_notes":"5"}]

每个{...},{...},{...} JSON 对象都有自己独特的数据行,我需要能够相应地分别返回每个{...} 以通过我已经设置的AJAX 函数提交。我的问题是如何遍历每个对象以返回整个数据,而不仅仅是整个字符串的位?这有意义吗?

这是吐出上述数据的代码:

//Global variables
var extractform = {
'cable_no' : "",
'section_no' : "",
'extract_ft' : "",
'cable_status' : "",
'conduit_status' : "",
'extract_date' : "",
'extraction_team' : "",
'extract_notes' : ""
}

//initially set up the store
if (!localStorage["Extract_Update"] ) {
localStorage["Extract_Update"] = JSON.stringify([]);
}
//Now return locally stored values, if set
if (localStorage["Extract_Update"]) {
var offlinExtractData = localStorage["Extract_Update"];
console.log("Array Length: " + localStorage["Extract_Update"].length + "\nParsed Data: " + offlinExtractData);
console.log(offlinExtractData[3]);
}

function update_extractform() {
$.ajax({
    type: 'POST',
    //url: './php/update_extractform.php',
    timeout: 8000, //8 seconds
    data: extractform,
    success: function(data) {
                //Save data (array) and push new data into existing web storage
                var aa = JSON.parse( localStorage["Extract_Update"] );
                console.log( aa );
                aa.push( [ extractform ] );
                localStorage["Extract_Update"] = JSON.stringify( aa );
                console.log("Submitted (offline): " + localStorage["Extract_Update"]);
}

【问题讨论】:

  • 如果我理解正确,您将在每次提交表单时将Array 推入“Extract_Update”Array。这似乎没有必要——为什么不直接推送已经采用Object 格式的表单数据本身呢? aa.push(extractform)
  • 这似乎是一个很长、很复杂的解释,可能是一个非常简单的问题。您能否简化为只是您遇到的代码问题?
  • 感谢您的收获,上帝。抱歉,解释太长了,我想我应该创建上下文。基本上,offlinExtractData[3] 的控制台日志仅从第一个 JSON 对象的 {"cable_no":"90012"......} 返回“c”,我希望 offlinExtractData[3] 将第三个 JSON 对象返回为一个整体,这样我就会得到 {"cable_no":"90012","section_no":"1","extract_ft":"3","cable_status":"Done","conduit_status":"Liner 2" ,"extract_date":"2013-09-26","extraction_team":"Unknown","extract_notes":"3"} 代替。我怎样才能做到这一点?谢谢!!
  • 另一个问题是 localStorage["Extract_Update"].length 将返回 893,因为它会计算数组中的每个字符...我希望计数遍历数组中的每个对象,而不是字符。因此,对于我提供的存储多个提交的示例,我希望返回的长度值为 5。因此,再次澄清一下,我希望能够遍历数组的每个对象,而不是字符。因为 offlinExtractData[3] 只是单步遍历 JSON 字符串中的每个字符,但我希望它单步遍历存储在 localStorage 中的 JSON 数据的每个对象。

标签: javascript json local-storage


【解决方案1】:

如果您有 JSON 对象的字符串表示,将其转换为 javascript 对象以进行迭代的一种方法是:

eval(offlinExtractData)[3]

在 IE 8+、Firefox 3.1+、Safari 4+、Chrome 3+ 和 Opera 10.5+(基于 Browser-native JSON support (window.JSON))中,您还可以使用以下方法避免 eval:

JSON.parse(offlinExtractData)[3]

要获得更多支持,您还可以使用外部 JSON 解析器,例如 https://github.com/douglascrockford/JSON-js/blob/master/json2.js

【讨论】:

  • 你摇滚!这太简单了……当然,解析 json 字符串……我是 JSON 的新手,但我知道我在哪里会因为错过它而感到愚蠢。现在我可以使用 eval(offlinExtractData).length 返回 "5" 并且有我的计数函数?
  • 有点新问题,可能需要创建一个新主题:现在我如何开始从本地存储中清除每个 json 对象,因为它遍历每个对象?我的 for 循环将在遍历每个对象之前清除所有本地存储。我只设置“Extract_Data”的单个项目,因此似乎无法删除本地存储项目中的特定内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2013-09-22
  • 2017-06-06
  • 1970-01-01
  • 2014-01-13
  • 2017-12-24
相关资源
最近更新 更多