4

在我的 Javascript 应用程序中,我有一个对象,我需要能够通过内部对象中的值对数组进行排序。

例如:

{
    a : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    b : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    c : {
        timestamp: xxxxxx
        other : yyyyyy
    }
}

我需要做的是管理这个数据集并根据每个内部对象的时间戳重新排序数组。

我可以采取哪些方法来做到这一点?

更新:

我最初的想法是这样做:

{
    a : {},
    b : {},
    c : {},
    _ : [
        c, a, b //Key's Only
    ]
}

然后根据这些值重新索引对象,这将解决如何索引对象,但是当我插入一个新元素时,我还必须重新生成_索引关系,这似乎很费力。

4

5 回答 5

6

您可以将数据复制到数组中,然后对其进行排序:

var data = {
    a : {
        timestamp: 11111,
        other : "xxx"
    },
    b : {
        timestamp: 22222,
        other : "yyy"
    },
    c : {
        timestamp: 33333,
        other : "zzz"
    }
};

var output = [];

// copy items to an array so they can be sorted
for (var key in data) {
    data[key].key = key;   // save key so you can access it from the array (will modify original data)
    output.push(data[key]);
}    

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

将其生成为输出(注意我将原始键添加到对象中,以便可以从数组中访问它):

[{"timestamp":11111,"other":"xxx","key":"a"},
{"timestamp":22222,"other":"yyy","key":"b"},
{"timestamp":33333,"other":"zzz","key":"c"}]

你可以在这里看到这个工作:http: //jsfiddle.net/jfriend00/hXpkP/

于 2011-09-14T01:43:55.000 回答
2

正如其他人已经说过的那样,您正在处理一个关联对象。不是数组。对象没有顺序。

如果您希望保持原样,而是对键数组进行排序,您可以这样做:

var obj = {
    a : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    b : {
        timestamp: xxxxxx
        other : yyyyyy
    },
    c : {
        timestamp: xxxxxx
        other : yyyyyy
    }
};

var keys = [];
for(var key in obj) {
    keys.push(key);
}

keys.sort(function(a, b) {
    return obj[a].timestamp - obj[b].timestamp;
});

现在您可以通过数组值访问对象(例如 obj[keys[0]]、obj[keys[1]] 等)。这假设时间戳是数字的。如果它们是日期对象,则排序应为:

keys.sort(function(a, b) {
    return +obj[a].timestamp - (+obj[b].timestamp);
});

如果时间戳实际上是表示日期时间的字符串(如“2012 年 8 月 2 日”),那么它应该是:

keys.sort(function(a, b) {
    return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp));
});

因此,请使用在您的场景中最有意义的任何内容。

于 2011-09-14T01:09:43.613 回答
2

Javascript 对象不是关联数组。它们的行为可能相似,但它们并不相同。Javascript 没有关联数组。

虽然关联数组具有顺序概念,但 Javascript 对象根本不与它们共享此特定功能。物体,就其本质而言,是没有秩序的。

所以,回答你的问题:你不能订购它们......

于 2011-09-14T00:50:51.863 回答
2

您处理的不是数组,而是属性值为ab和的对象c

没有理由按特定顺序需要它们,因为您不能真正按任何特定顺序循环它们。

sort如果您正在使用数组,这将是微不足道的(使用)......

var array = [
    {
        timestamp: xxxxxx
        other : yyyyyy
    },
    {
        timestamp: xxxxxx
        other : yyyyyy
    },
    {
        timestamp: xxxxxx
        other : yyyyyy
    }
];

array.sort(function(a,b) {
    return a.timestamp - b.timestamp;
});
于 2011-09-14T00:52:42.227 回答
0

您可以创建自定义比较器函数并使用数组的内置排序函数。看到这个帖子

于 2011-09-14T01:22:39.177 回答