【问题标题】:Create array of keys by sorting values通过对值进行排序来创建键数组
【发布时间】:2014-01-20 07:09:31
【问题描述】:

我有一个像这样的对象

myList: {  
id1:{  
      ts:'2010-01-12T00:51:00',
      name:"roger"
     },  
id2:{  
      ts:'2011-01-12T05:22:00',
      name: "Tom"
  },  
id3:{  
      ts:'2013-01-12T11:32:00',
      name:"Jack"
  }
}

我知道对象无法排序,所以我想知道如何生成一个仅包含键的数组,这些键是根据键“ts”排序的。我想要这个按降序排列。

所以上述对象的数组将是 [id3,id2,id1]

一旦我有了这个数组,我就可以进行这样的操作,其中 arr 是排序数组,myList 是对象

for(var i=0:i<arr.length;i++)
{
alert(myList[arr[i]].name);
}

【问题讨论】:

  • 日期的字符串比较?
  • 如前所述,上面的 ts 值为 1997、1998 和 2000,但这似乎是预期的结果。
  • 我是 js 新手,所以如果你有一个可以生成这样一个数组的解决方案,我将不胜感激
  • 你可能想阅读stackoverflow.com/questions/2947822/javascript-sort-objects 另外,字符串应该有引号,否则它充其量只是数学。
  • 你基本上想要一个集合:list=[{id:1,ts:'2010-01-12'},{id:2,ts:'2011-01-12'},...]

标签: javascript jquery sorting object


【解决方案1】:
var keys = Object.keys(myList).sort(function(a, b) {
    if (myList[a].ts == myList[b].ts) {
        return 0;
    }
    return myList[a].ts < myList[b].ts ? 1 : -1;
});

console.log(keys);

jsfiddle:http://jsfiddle.net/pWq2L/

解释:

  1. 首先从对象中导出密钥:Object.keys(myList)
  2. 您使用自定义比较函数进行排序,并在其中引用比较值的.ts 属性。 ab 是比较元素的键

参考资料:

【讨论】:

    【解决方案2】:

    鉴于此数据结构,并假设它有充分的理由不是数组:

    var myList = {
      id1: {  
        ts: new Date('2010-01-12T00:51:00'),
        name: 'Roger'
      },
      id2: {  
        ts: new Date('2011-01-12T05:22:00'),
        name: 'Tom'
      },  
      id3:{  
        ts: new Date('2013-01-12T11:32:00'),
        name: 'Jack'
      }
    }
    

    我们可以像这样创建一个数组并对其进行排序:

    var arr = [];
    Object.keys(myList).forEach(function(item) {
      arr.push(myList[item]);
    });
    arr.sort(function(a, b) {
      return a.ts > b.ts ? -1 : a.ts < b.ts ? 1 : 0;
    })
    

    【讨论】:

      【解决方案3】:

      扩展zerkms 解决方案的一种方法是使用具有智能属性的对象。多才多艺的reduce 派上用场了:

      var result = keys.reduce(function(arr, k, i) {
          var item = {
            key: k,
            index: i,
            value: myList[k]
          };
          arr.push(item);
          return arr;
      }, []);
      
      
      //result:
      [
        { index:0 , key: id3, value: {...} },
        { index:1 , key: id2, value: {...} },
        { index:2 , key: id1, value: {...} }
      ]
      

      reduce 是 ECMAScript 第 5 版的一部分;所以你可以用 polyfill 填补一些空白。

      http://jsfiddle.net/pWq2L/3/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 2017-08-20
        相关资源
        最近更新 更多