javascript - 排序映射实现

标签 javascript jquery map underscore.js sortedmap

我的任务

在我的 JavaScript 代码中,我经常使用对象将键“映射”到值,这样我以后可以通过某个值直接访问它们。例如:

var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";

因此,我在源代码中使用两种可用的符号对象样式数组样式 逐步构建 map 对象。

例如,稍后我可以通过 helloMap["de"] 访问我添加的值。因此,如果我不必关心在对象上设置属性的顺序,那就没问题了。

如果我现在想迭代对象属性,就我所知,没有办法确保我将按照它们添加的顺序迭代它们。

注意:我不能使用一些包装器对象,只能在其中保存一个数组,然后使用它的方法添加值,就像这样:

var HelloMap = function(){
  this.myMap = [];
  this.addProperty = function(key, value){
    this.myMap.push({key: key, value: value});
  }
}

或类似的东西对我不起作用。因此,解决方案需要对使用该对象的程序员绝对透明。

也就是说,我需要的对象是一个空对象,它维护添加到它的属性的顺序。像这样的事情会做:

var helloMap = {};
helloMap = getOrderAwareObject(helloMap);

这样,helloMap.xy = "foo"helloMap["yz"] = "bar" 形式的每个进一步赋值都将在对象中被跟踪 "按顺序”,

可能的解决方案

因为我没有在下划线或 jQuery 中找到任何解决方案给我这样一个特殊的对象,所以我遇到了使用 Object.defineProperty 为 JavaScript 对象中的属性定义 getter 和 setter 的可能性,因为我可以依赖在 ECMAScript 5 标准上我可以使用它。

这个的问题是,在实际设置之前,您必须知道可以在对象上设置的所有可能属性。因为如果您定义它,您就必须命名它。

我正在搜索的是类似默认 Getter默认 Setter 的东西,如果没有为属性定义 getter 和 setter,它们将应用于对象。这样我就可以将排序的 map 隐藏在对象界面的后面。

  • 在您知道的任何框架中是否已经有针对此问题的解决方案?
  • 是否有类似“默认 getter/setter”的机制?

最佳答案

恐怕您需要某种在内部使用数组的包装器。 ECMAScript 5(这是当前浏览器 JavaScript 实现所基于的标准)根本不允许有序的对象属性。

然而,ECMAScript 6 将有一个 Map implementation具有有序属性。另见 http://www.nczonline.net/blog/2012/10/09/ecmascript-6-collections-part-2-maps/ .

ECMAScript 6 中可能还有其他选项。请参阅以下问题:

How can I define a default getter and setter using ECMAScript 5?

关于javascript - 排序映射实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14645035/

相关文章:

javascript - 使用 Javascript 设置多个 Cookie

javascript - 使用 javascript (CRM 4.0) 在 IE 上打开文件夹?

javascript - jQuery 的 .css() 方法实际上是 CSS 吗?

javascript - 修改 jQuery $ 函数以支持遗留代码

map - 获取无效操作 : mymap ["title"] (type interface {} does not support indexing) when trying to index a map

javascript - JS .hover 可见性不起作用(ASP.NET、VS2013、Web 表单)

javascript - Chart.js 控制网格线之间的空间/大小

javascript - 动态地在左侧显示具有相同类的 div,在右侧显示下一个类等等?

java - 如何在 Java 中连接两个可为空的集合

perl - 用哈希值替换数组元素