按值排序Javascript对象
在我的Javascript应用程序中,我有一个对象,我需要能够按照内部对象中的值对数组进行排序 例如:按值排序Javascript对象,javascript,arrays,sorting,map,object-literal,Javascript,Arrays,Sorting,Map,Object Literal,在我的Javascript应用程序中,我有一个对象,我需要能够按照内部对象中的值对数组进行排序 例如: { a : { timestamp: xxxxxx other : yyyyyy }, b : { timestamp: xxxxxx other : yyyyyy }, c : { timestamp: xxxxxx other : yyyyyy }
{
a : {
timestamp: xxxxxx
other : yyyyyy
},
b : {
timestamp: xxxxxx
other : yyyyyy
},
c : {
timestamp: xxxxxx
other : yyyyyy
}
}
我需要做的是管理这个数据集,并根据每个内部对象的时间戳对数组重新排序
我可以用什么方法来做到这一点
更新:
我最初的想法是这样做:
{
a : {},
b : {},
c : {},
_ : [
c, a, b //Key's Only
]
}
然后根据这些值对对象重新编制索引,这将解决如何为对象编制索引的问题,但当我插入新元素时,我还必须重新生成
索引关系,这似乎需要付出很大的努力。Javascript对象是而不是关联数组。它们的行为可能相似,但它们并不相同。Javascript没有关联数组
虽然关联数组有顺序的概念,但Javascript对象并不与它们共享此特定功能。从本质上讲,物体是不有序的
因此,为了回答您的问题:您不能对它们进行排序…您处理的不是数组,而是属性值为
a
、b
和c
的对象
没有理由需要按照特定的顺序使用它们,因为您无法按照任何特定的顺序对它们进行循环
如果正在使用数组,那么这将非常简单(使用)
var array = [
{
timestamp: xxxxxx
other : yyyyyy
},
{
timestamp: xxxxxx
other : yyyyyy
},
{
timestamp: xxxxxx
other : yyyyyy
}
];
array.sort(function(a,b) {
return a.timestamp - b.timestamp;
});
正如其他人已经说过的,您正在处理一个关联对象。不是数组。对象没有顺序 若希望保持原样,并对密钥数组进行排序,则可以执行以下操作:
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);
});
keys.sort(function(a, b) {
return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp));
});
如果时间戳实际上是表示日期时间的字符串(如“2012年8月2日”),那么它应该是:
keys.sort(function(a, b) {
return +obj[a].timestamp - (+obj[b].timestamp);
});
keys.sort(function(a, b) {
return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp));
});
因此,在您的场景中使用最有意义的方法。您可以创建一个自定义比较器函数,并使用内置的数组排序函数。请参见此图。您可以将数据复制到数组中,然后对其进行排序:
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);
});
将其作为输出生成(注意,我向对象添加了原始键,以便可以从数组中访问该对象):
您可以在这里看到这一点:数组的问题在于它们没有基于字符串的索引,并且为了快速访问需要基于字符串的索引的元素,所有javascript索引都是字符串,javascript数组都是对象,它们只有一些额外的有用功能。。。一个你特别想要的。。。不要忘记对对象属性进行hasOwnProperty测试,也可以包括内置属性。当然,对象没有顺序,但这并不意味着没有可能的解决方案。您可以创建索引、键值哈希表和“顺序”,并在需要时使用从一个数组到对象的引用