【问题标题】:Why do associative arrays don't work in localStorage[""]?为什么关联数组在 localStorage[""] 中不起作用?
【发布时间】:2011-07-10 10:25:33
【问题描述】:

例如我有以下代码:

  localStorage["screenshots"] = new Array();
  localStorage["screenshots"]["a"] = 9;
  alert(localStorage["screenshots"]["a"]);

  Arr = new Array();
  Arr["screenshots"] = new Array();
  Arr["screenshots"]["a"] = 9;
  alert(Arr["screenshots"]["a"]);

(我在 Windows Vista 32 位上使用 Google Chrome v9.0.597.107)

但只有第二部分有效(alert() 的输出是“a”)! 第一个警报输出对比“未定义”!

有什么问题?

谢谢。

【问题讨论】:

  • 与本地存储问题无关,但是JS没有关联数组这个概念。当您创建一个数组并通过 ["name"] 语法添加项目时,您实际上是在向该 Array 实例对象添加一个属性。数组的长度属性不会改变,数组也不会被认为有任何项目。如果你不是在索引数组之后,你应该做的是创建一个对象(唯一的 Array JS 知道任何事情)。
  • @JAAulde:这是一个极度的误导性陈述。 JavaScript 有对象,使用new Object() 或对象文字语法{} 创建,它们 associative arrays
  • @Matt 不,它们是对象。您链接的网站混合了术语,是误导发生的地方。您可以按照其他语言处理关联数组(方括号中的字符串命名属性访问)的方式处理它们,但它们不是数组。它们没有通过操作维护的长度属性,也没有与数组相关的方法,例如 push、shift 等。JS 只有一个对象属于数组类别,即用 Array( )。它是一个索引数组,而不是关联数组。
  • @JAAulde:您使用的是什么定义的关联数组?我没有看到任何东西,比如Wikipedia,说关联数组必须有length 属性或(整数索引)数组方法。据我了解,基本方法是(维基百科似乎同意我的观点):addreassignremovelookup。另见this article
  • @Matt,诚然,这里存在一些语义问题。用计算机科学术语来说,JS 在用于其对象的哈希表机制中实现关联数组是对的。不过,我说的是 JS 细节。尽管在底层使用了 assoc 数组,但 JS 并没有通过这样的名称为开发人员提供这样的构造。 JS 提供了 Objects,它的子类是一个数组( Array() )。在 JS 中,当您使用 Array 时,这是因为您需要我前面提到的行为。我的第一条评论源于我认为对该结构的滥用

标签: javascript arrays html google-chrome associative-array


【解决方案1】:

localStorage 将值存储为字符串,因此您需要在传入对象时对对象进行 JSON 序列化,并在传出对象时对其进行反序列化。例如:

var data = {'A': 9};

localStorage['screenshots'] = JSON.stringify(data);

// Later/elsewhere:

var data = JSON.parse(localStorage['screenshots']);

// 9
console.log(data.A);

【讨论】:

  • 请注意,JSON 对象在默认情况下尚未在所有浏览器中可用,因此如果您的代码可以在任何地方工作,则需要像 json2.js 这样的库。
  • 所有实现HTML5 localStorage的浏览器都可以使用。
【解决方案2】:

本地存储存储字符串键和字符串值。

DOM 存储机制是一种方法,通过它可以安全地存储字符串键/值对并在以后检索以供使用。

来源:MDC

【讨论】:

  • 但我不明白的是为什么语言环境存储不是数组!
  • @user:你什么意思?它不是一个数组,它是一个只接受字符串的键值存储。您是在问“为什么我只能将字符串存储在 localStorage 中?”
  • 否:为什么 localStorage 只是一个键值存储?
【解决方案3】:

localStorage 对象只能存储字符串。要存储其他类型的数据,必须将它们转换为字符串,并在检索时将它们转换回来。在大多数情况下,您会希望使用 JSON 来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    相关资源
    最近更新 更多