【问题标题】:Sort by object key in descending order on Javascript/underscore在 Javascript/下划线上按对象键降序排序
【发布时间】:2015-10-11 17:44:58
【问题描述】:

我有以下对象数组,其中键是 UTC 格式的日期。

    Array = [{1436796000000:["Task1","Task2"],
         1437400800000:["Task4","Task8"],
         1436968800000: ["Task3","Task2"],
         1436882400000:["Task5","Task6"]}]

我想按降序键对这个数组对象进行排序。因此,预期的输出将紧随其后,就像最新的日期在前一样。

    Array = [{1437400800000:["Task4","Task8"],
             1436968800000: ["Task3","Task2"],
             1436882400000:["Task5","Task6"],
             1436796000000:["Task1","Task2"]}]

如何在 javascript 中或使用 underscore.js 执行此操作?

【问题讨论】:

  • 不可能。不完全是。数组键总是按升序排列。只需向后迭代!

标签: javascript arrays sorting underscore.js


【解决方案1】:

不,这不是一个数组,它是一个对象,而 Javascript 对象的属性根据定义是无序的;所以对它们进行排序是没有意义的。

您可以改为使用具有顺序的数组,并像这样重构您的数据:

var arr = [
  { date: 1436796000000, value: ["Task1","Task2"] },
  { date: 1437400800000, value: ["Task4","Task8"] },
  { date: 1436968800000, value: ["Task3","Task2"] },
  { date: 1436882400000, value: ["Task5","Task6"] }
]

然后你可以按日期排序:

arr.sort( function ( a, b ) { return b.date - a.date; } );

如果您不想重构数据,您可以按您想要的顺序遍历它,方法是获取其键的数组并对该数组进行排序,然后使用该数组访问对象的属性,但您会每次您想以特定顺序遍历它时都需要这样做,因为对象中仍然没有存储顺序信息:

// Get the array of keys
var keys = Object.keys( obj );

// Sort the keys in descending order
keys.sort( function ( a, b ) { return b - a; } );

// Iterate through the array of keys and access the corresponding object properties
for ( var i = 0; i < keys.length; i++ ) {
    console.log( keys[i], obj[ keys[i] ] );
}

您需要 shim Object.keys 以支持 IE 8 和更早版本的浏览器。

【讨论】:

  • 我担心它实际上是一个用作对象的数组。
  • @NutBoltu,不,编辑后你有一个只有一个元素的数组(所以它总是数组中的第一个元素),那个元素是一个对象,它的属性是无序的。跨度>
  • 有什么方法可以订购对象元素吗?
  • @NutBoltu 不,没有办法。 Javascript 对象的定义是an **unordered** collection of properties。但是,您可以获取对象键的数组,对其进行排序,然后像这样遍历它:var keys = Object.keys( obj ); keys.sort( function ( a, b ) { return a - b; } ); for ( var i = 0; i &lt; keys.length; i++ ) { console.log( keys[i], obj[ keys[i] ] ); }
  • 如果你想支持 IE 8 或更早的浏览器,你需要 SHIM Object.keys 才能工作:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案2】:

在 Paulpro 的回答中,我编辑了 javascript 数组排序函数(易于理解):

function compare(a,b) {
   if (a.date < b.date )
     return -1;
   if (a.date  > b.date )
    return 1;
   return 0;
}
arr.sort(compare);

这是我的例子:enter link description here

这里是相关帖子:enter link description here

【讨论】:

  • 为什么这么复杂? last_nom 是什么?这和这个问题有什么关系?
  • 嗯,OPs数组中也没有.date
  • 顺便说一句,your fiddle中的比较函数是kinda broken
  • 我认为这与我的问题无关。
【解决方案3】:

这是我为我的用例所做的,希望对您有所帮助

var list = {30: "103", 40: "75", 50: "116", 100: "15"};
// Reverse sorting on key
const keysSorted = Object.keys(list).sort(function(a,b){return b-a})
console.log(keysSorted);

const arr = [];
// Adding the sorted result to an array of object
for (let i=0; i<keysSorted.length;i++) {
  const obj = {};
  obj.per= keysSorted[i];
  obj.val= list[keysSorted[i]];
  arr.push(obj);
}

console.log(arr);

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 2011-07-24
    • 1970-01-01
    相关资源
    最近更新 更多