我有一个对象文字如下:
var obj = {
one: "short-term",
two: "long-term",
three: "mid-term",
four: "long-term",
five: "short-term",
six: "short-term",
seven: "long-term",
eight: "mid-term",
nine: "short-term",
ten: "mid-term"
};
我想根据值对键/值对的顺序进行排序,以便最终结果为:
var obj = {
one: "short-term",
five: "short-term",
six: "short-term",
nine: "short-term",
three: "mid-term",
eight: "mid-term",
ten: "mid-term",
two: "long-term",
four: "long-term",
seven: "long-term"
};
我的排序方法非常简单,可能效率低下(以下是FIDDLE):
var sorted = {};
for (var i in obj) {
if (obj[i] === "short-term") {
sorted[i] = obj[i];
}
}
for (var i in obj) {
if (obj[i] === "mid-term") {
sorted[i] = obj[i];
}
}
for (var i in obj) {
if (obj[i] === "long-term") {
sorted[i] = obj[i];
}
}
这个给定的场景是否可以通过使用或不使用jQuery而不使用其他库来遍历对象 来实现相同的结果?
我的项目中有很多类似的情况,我需要使用相同的排序方法,我担心目前的处理方式对于大量的对象来说并不是最佳的。
答案 0 :(得分:2)
如果不修改你的obj结构,你可以这样做:
var sortedKeys=[];
for(var i in obj){
sortedKeys.push({key:i, value:obj[i]}) // push key and value to array
}
sortedKeys.sort(function(a,b){ // sort array by value
return a.value < b.value
})
for(var i=0;i<sortedKeys.length;i++){ // you can either use now sortedKeys or keep using obj
console.log(obj[sortedKeys[i].key])
console.log(sortedKeys[i].value)
}
答案 1 :(得分:-1)
Javascript中的对象是散列图。您不应该期望每个解释器 - 例如,浏览器(如果要在页面中运行) - 按照插入顺序向您显示密钥。
如果您需要订购,我建议您填充一个数组。但是,如果要继续使用对象,则可以为每个值添加order
属性。您可以像这样重新构建地图:
var obj = {
one: { value: "short-term", order: 1 },
five: { value: "short-term", order: 2 },
/* .. SNIP .. */
};
然后,您可以提出一种排序机制,并在需要检索值时应用它。