Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 排序映射实现_Javascript_Jquery_Map_Underscore.js_Sortedmap - Fatal编程技术网

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”]添加的值。因此,如果我不必关心对象上属性设置

我的任务

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

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;
       }
      }