排序地图实施

Chr*_*ris 4 javascript jquery map sortedmap underscore.js

我的任务

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

var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";
Run Code Online (Sandbox Code Playgroud)

所以我使用两种可用的符号对象样式数组样式在源代码中逐步构建地图对象.

之后我可以访问我添加的值helloMap["de"],例如.如果我不必关心在对象上设置属性的顺序,那就没关系了.

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

注意:我不能使用一些包装器对象,只需在其中保存一个数组,然后使用其方法添加值,如下所示:

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

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

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

var helloMap = {};
helloMap = getOrderAwareObject(helloMap);
Run Code Online (Sandbox Code Playgroud)

使得每个以下形式的进一步分配helloMap.xy = "foo"helloMap["yz"] = "bar"将在对象被跟踪"按顺序",

可能的解决方案

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

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

我正在搜索的内容类似于Default GetterDefault Setter,如果没有为该属性定义getter和setter,它将应用于该对象.所以我可以隐藏对象界面后面的有序映射.

  • 在您知道的任何框架中是否已经有解决方案?
  • 有没有像"默认getter/setter"这样的机制?

Tim*_*own 6

我担心你需要一个内部使用数组的包装器.ECMAScript 5(这是当前浏览器JavaScript实现所基于的标准)根本不允许有序对象属性.

但是,ECMAScript 6将具有已订购属性的Map实现.另见http://www.nczonline.net/blog/2012/10/09/ecmascript-6-collections-part-2-maps/.

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

如何使用ECMAScript 5定义默认的getter和setter?


fac*_*tum 5

添加指向自定义 javascript 库的链接,该库提供 Sorted maps 和其他实现,以供将来在此线程中参考。查看https://github.com/monmohan/dsjslib -msingh