【问题标题】:Sorting Object by sub-object property按子对象属性排序对象
【发布时间】:2011-05-19 05:53:15
【问题描述】:

我有一个对象的对象,我想按属性对其进行排序......我的头有点麻烦:

sample = {
    "Elem1": { title: "Developer", age: 33 },
    "Elem2": { title: "Accountant", age: 24 },
    "Elem3": { title: "Manager", age: 53 },
    "Elem4": { title: "Intern", age: 18}
}

我的预期结果将是一个对象,其键现在排序为 Elem4、Elem2、Elem1、Elem3。或者,我可以简单地按该顺序返回键,而不是对对象进行物理排序。

这是否比它的价值更麻烦,还是我错过了一些明显(或不那么明显)的 JavaScript-Fu 可以轻松完成这样的事情?

谢谢!

【问题讨论】:

    标签: javascript


    【解决方案1】:

    对象的属性(键)本质上不是有序的;如果您愿意,您必须维护自己的排序数组。

    这是一个示例,说明如何通过自定义排序函数通过任意属性简化对示例对象的排序:

    var orderKeys = function(o, f) {
      var os=[], ks=[], i;
      for (i in o) {
        os.push([i, o[i]]);
      }
      os.sort(function(a,b){return f(a[1],b[1]);});
      for (i=0; i<os.length; i++) {
        ks.push(os[i][0]);
      }
      return ks;
    };
    
    orderKeys(sample, function(a, b) {
      return a.age - b.age;
    }); // => ["Elem4", "Elem2", "Elem1", "Elem3"]
    
    orderKeys(sample, function(a, b) {
      return a.title.localeCompare(b.title);
    }); // => ["Elem2", "Elem1", "Elem4", "Elem3"]
    

    一旦属性按你喜欢的顺序排序,你就可以迭代它们并按顺序检索相应的值。

    【讨论】:

    • 感谢您的回复,非常感谢您的代码示例!
    【解决方案2】:

    JavaScript 中的Object 没有属性顺序;它们在迭代时可能以任何顺序出现(尽管实际上它们通常按它们定义的顺序出现)。

    使用具有明确顺序的Arraysort() 方法。

    如果是Array,您可以使用...

    sample.sort(function(a, b) {
        return a.age - b.age;
    });
    

    jsFiddle.

    【讨论】:

      【解决方案3】:

      嗯,你不能对哈希图进行排序。 :)

      但是,如果您有一个实际的数组,这是一个非常简单的排序。

      var sample = [{title:'Developer', age:33}, ...  etc  ];
      
      function ageSorter(a,b)
      {
         return ((a.age) < (b.age)) ? 1 : -1;
      }
      
      sample.sort(ageSorter);
      

      【讨论】:

        【解决方案4】:

        搜索相同。 maerics anwser 正在工作,但是当我将比较功能移到新的排序功能中时,它会更容易使用(在大多数情况下)。 如果你在对象原型中添加了一些东西,这个版本也不会中断。

        function subObjSortKeys(o,k,f)
        {
         let keys=[],opa=[],i;
         for(i in o) if(o.hasOwnProperty(i)) keys.push([i,o[i]]);
         if(!f) f=isNaN(keys[0][1][k])?((a,b)=>a.localeCompare(b)):((a,b)=>a-b);
         keys.sort((a,b)=> f(a[1][k],b[1][k]));
         for(i=0; i<keys.length; i++) opa.push(keys[i][0]);
         return opa;
        }
        
        console.log(subObjSortKeys(sample, 'age'));
        console.log(subObjSortKeys(sample, 'title'));
        

        【讨论】:

          猜你喜欢
          • 2016-02-08
          • 2010-12-14
          • 1970-01-01
          • 2011-01-28
          • 2011-03-21
          • 1970-01-01
          • 2014-06-26
          • 1970-01-01
          • 2013-02-12
          相关资源
          最近更新 更多