我的任务
在我的 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/