JavaScript:优化排序自定义对象文字

时间:2014-10-15 17:38:11

标签: javascript sorting object-literal

我有一个对象文字如下:

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而不使用其他库来遍历对象 来实现相同的结果?

我的项目中有很多类似的情况,我需要使用相同的排序方法,我担心目前的处理方式对于大量的对象来说并不是最佳的。

2 个答案:

答案 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 .. */
};

然后,您可以提出一种排序机制,并在需要检索值时应用它。