Javascript 排序映射实现
我的任务 在我的JavaScript代码中,我经常使用对象将键“映射”到值,以便以后可以通过某个值直接访问它们。例如:Javascript 排序映射实现,javascript,jquery,map,underscore.js,sortedmap,Javascript,Jquery,Map,Underscore.js,Sortedmap,我的任务 在我的JavaScript代码中,我经常使用对象将键“映射”到值,以便以后可以通过某个值直接访问它们。例如: var helloMap = {}; helloMap.de = "Hallo"; helloMap["en"] = "Hello"; helloMap.es = "Hola"; 因此,我在源代码中使用两种可用的符号object style和array style逐步构建map对象 稍后,我可以访问我通过helloMap[“de”]添加的值。因此,如果我不必关心对象上属性设置
var helloMap = {};
helloMap.de = "Hallo";
helloMap["en"] = "Hello";
helloMap.es = "Hola";
因此,我在源代码中使用两种可用的符号object style和array style逐步构建map对象
稍后,我可以访问我通过helloMap[“de”]
添加的值。因此,如果我不必关心对象上属性设置的顺序,那么这一切都很好
如果我现在想迭代objects属性,据我所知,没有办法确保我将按照添加它们的顺序进行迭代
注意:我不能使用一些包装器对象,而只是在其中保存一个数组,然后使用它的方法添加值,所以类似这样:
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,它将应用于对象。因此,我可以将排序贴图隐藏在对象界面后面
- 在您知道的任何框架中,是否已经有了解决方案
- 是否有类似“默认getter/setter”的机制
- 恐怕您需要一个内部使用数组的某种包装器。ECMAScript 5(当前浏览器JavaScript实现所基于的标准)根本不允许有序对象属性
但是,ECMAScript 6将具有具有有序属性的。另见
ECMAScript 6中可能还有其他选项。见以下问题:
我不知道一般解,但非一般解的构造非常简单 通常,维护一个对象数组,并将多个方法定义为数组的属性。至少,这是我的方法 下面是一个示例(以修改后的形式)取自一个更大的应用程序:
var srcs = [];
srcs.find = function(dist) {
var i;
for(i=0; i<this.length; i++) {
if(dist <= this[i].dist) { return this[i]; }
}
return null;
};
srcs.add = function(dist, src) {
this.push({ dist:dist, src:src });
}
srcs.remove = function(dist) {
var i;
for(i=0; i<this.length; i++) {
if(this[i].dist === dist) {
srcs.splice(i,1);
return true;
}
}
return false;
};
srcs.add(-1, 'item_0.gif' );
srcs.add(1.7, 'item_1.gif');
srcs.add(5, 'item_2.gif');
srcs.add(15, 'item_3.gif');
srcs.add(90, 'item_4.gif');
var srcs=[];
srcs.find=函数(dist){
var i;
对于(i=0;i添加到自定义javascript库的链接,该库提供排序映射和其他实现,以供将来在此线程中参考。请检查
-msingh查看我对问题的回答。我实现了一个基本的有序哈希表(仅限ES 5+版,不必进行多边形填充)
Put方法将始终获取一个键值对,在内部使用实际映射中的排序键创建另一个映射,更新值并返回带有排序键的更新映射。无需包含外部库。如果顺序很重要,则必须使用数组。是..嗯..谢谢。但关联数组的问题是它们可以“不能通过我需要的点运算符访问。顺便问一下……你确定它们甚至保持了顺序吗?Javascript不做关联数组。你可以设置数组属性,但它们独立于索引数组项,并且与普通js对象的属性一样无序。好的,谢谢,所以数组不是解决方案。”e、 至少在“前”实现中。对象可以在后面创建数组,但在对象端需要透明。如果顺序很重要,数组是唯一的解决方案。是的,您可以将其隐藏在构造的对象中。感谢这里的最后提示!维护对象和数组似乎是一个好的“暂时”我的具体案例的解决方案。不可能预先添加到ES6映射类型,对吗?这看起来很有用。谢谢发布。我也找到了这个()但文档不清楚,API很混乱(例如set(key,value)vs add(value,key)),因此,我很难相信实现
var put = function(k,v){
if(map[k]){
console.log("Key "+ k+" is already present");
}else
{
var newMap = {};
map[k] = v;
Object.keys(map).sort().forEach(function(key){
newMap[key] = map[key];
});
map = newMap;
//delete newMap; in case object memory need to release
return map;
}
}