按值排序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 }

在我的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
    ]
}

然后根据这些值对对象重新编制索引,这将解决如何为对象编制索引的问题,但当我插入新元素时,我还必须重新生成
索引关系,这似乎需要付出很大的努力。

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测试,也可以包括内置属性。当然,对象没有顺序,但这并不意味着没有可能的解决方案。您可以创建索引、键值哈希表和“顺序”,并在需要时使用从一个数组到对象的引用