【问题标题】:Javascript sorting Object datesJavascript 排序对象日期
【发布时间】:2015-04-19 13:07:16
【问题描述】:

循环后我得到了以下数组。是否可以将其从当前日期排序到最新日期。

//Sortering
    var arr = {};
    var key = "";
    var teller = 0;
    for (var i = 0; i < schedule_id.length; i++) {

    //Ajax call maken
    $.ajax({
        url: "http://api.viewer.zmags.com/schedules/" + schedule_id[i] + "?key=" + api_key
    })
    //WdInit after 10 calls
    .done(function(data){

        //Check publicatieID is not null
        if (undefined === data.scheduleEntries[default_pub]|| null === data.scheduleEntries[default_pub]) {
        }
        else
        {       

            var key = schedule_id[teller];
            //loopen doorheen resultaat call
            $.each(data.scheduleEntries, function(index, entry){
                arr[key] = entry.startDate;
            })
        }   
        teller++;
    })
    }

arr: Object
7aaabbec: "2015-02-09T23:00:00.000Z"
31ba19e7: "2015-02-24T23:01:00.000Z"
31ff78e7: "2015-02-24T23:01:00.000Z"
159a11a7: "2015-02-10T23:01:00.000Z"
1339d0e9: "2015-02-17T23:01:00.000Z"

我已经得到但错误的代码:未定义不是函数

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

【问题讨论】:

  • 你说的情人到上级是什么意思?有什么依据??
  • 嗯...你能告诉我们更多关于“arr”的信息吗
  • 我会更新我的问题
  • ok 根据你的要求更新你的问题,说清楚你想要什么
  • 另外...不,您不能对object 进行排序。对Objects进行排序确实没有意义。

标签: javascript sorting object


【解决方案1】:

对象没有顺序。您不能订购对象。你必须先把它变成一个数组,它又不能有任意键,但是是可排序的。

在 Javascript 中:

  • 对象:未定义顺序的键值集合
  • 数组:有顺序但没有(有意义的)键的列表

【讨论】:

  • 您可以创建一个对象数组,然后对该数组进行排序。
  • [{id: '159a11a7', date: '2015-02-17T23:01:00.000Z'}, ..] - 这是典型的用例。 (感谢@Chris)
【解决方案2】:

首先从对象中获取键,你使用类似 underscore.js 的东西:

var keyList = _.keys( arr );

// sort keyList
keyList = keyList.sort();

// Now, do anything by getting values for sorted keys
for ( key in keyList ) {
    console.log( arr[ key ] );
}

只需阅读您的最新评论...对于您的情况,您可以先转换为列表列表或键值对列表

// convert into List of [ key, value ]
val pairList = _.pairs( arr );

// sort using values
pairList = pairList.sort( function( a, b ) {
    // use moment.js to get date functions
    var aMoment = moment( a[ 1 ] )
    var bMoment = moment( b[ 1 ] )

    // change based on reverse-sorted or sorted.
    return bMement.diff( aMement );
} );

// Now sorted use as you want
for ( keyVal in pairList ) {
    console.log( keyVal[ 0 ] + " -> " + keyVal[ 0 ] );
}

【讨论】:

    【解决方案3】:

    使用普通数组存储值,以便您对它们进行排序:

    arr = [];
    loopen doorheen resultaat call
    $.each(data.scheduleEntries, function(index, entry){
         arr.push( {'key':key, 'date':entry.startDate} );
    })
    
    arr.sort(function(a, b){
        return a['date'] > b['date']; //this may need a better comparision...
    });
    

    更新: 排序后提取哈希键只需循环数组:

    var sorted_keys = [];
    for(var i = 0; i < arr.length; i++){
      sorted_keys.push( arr[i] );
    }
    

    【讨论】:

    • 我使用 Object 作为一种 HashMap。日期部分仅用于排序,但稍后我想遍历键并使用我的函数的这个键。这在您的解决方案中可行吗?
    • 你可以循环它们结束提取排序后的日期或键,查看更新
    • array.push 是一种方法 - 您正在分配给它。
    【解决方案4】:

    通过循环对象,将所有日期放入数组中并对其进行排序并再次制作对象

                var myObj = {
                    '7aaabbec': "2015-02-09T23:00:00.000Z",
                    '31ba19e7': "2015-02-24T23:01:00.000Z",
                    '31ff78e7': "2015-02-24T23:01:00.000Z",
                    '159a11a7': "2015-02-10T23:01:00.000Z",
                    '1339d0e9': "2015-02-17T23:01:00.000Z"
                };
                var timeArray = [], newObj = {};
                for(var key in myObj){
                  timeArray.push([key,myObj[key]]); 
                }
                timeArray.sort(function(a, b) {return new Date(a[1]) - new Date(b[1])});
                //console.log(timeArray);
                var j=0,k=1;
                for(var i=0;i<timeArray.length;i++){
                  newObj[timeArray[i][j]] = new Date(timeArray[i][k]);
                }
                $("#result").html(JSON.stringify(newObj));
    

    工作示例是here

    【讨论】:

    • 并且通过再次创建对象,您将放弃订单。是的,在实践中,这通常可能导致“有序对象”,这仅仅是由于实现细节。但是,没有任何东西可以保证对象属性的顺序。您依赖于完全未定义的行为,在某些情况下可能会或可能不会随时中断。
    • 谢谢,我没有检查 FF,在创建新对象时,顺序正在改变。我正在努力解决这个问题。
    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多