我在对象内部排序项时遇到了一些问题。所以我有这样的事情:
var someObject = {
'type1': 'abc',
'type2': 'gty',
'type3': 'qwe',
'type4': 'bbvdd',
'type5': 'zxczvdf'
};
我想按值排序someObject,这就是我遇到问题的地方。 我有排序函数,应返回按值排序的键/值对:
function SortObject(passedObject) {
var values = [];
var sorted_obj = {};
for (var key in passedObject) {
if (passedObject.hasOwnProperty(key)) {
values.push(passedObject[key]);
}
}
// sort keys
values.sort();
// create new object based on Sorted Keys
jQuery.each(values, function (i, value) {
var key = GetKey(passedObject, value);
sorted_obj[key] = value;
});
return sorted_obj;
}
和获取密钥的功能:
function GetKey(someObject, value) {
for (var key in someObject) {
if (someObject[key] === value) {
return key;
}
}
}
在创建新的返回对象时,问题出在最后一部分 - 它再次按键排序。为什么?这是特定情况,当我必须操作对象不在数组上时(是的,我知道这会更容易......)
有谁知道如何对对象中的项目进行排序?
答案 0 :(得分:3)
普通物品根本没有订单。数组 - 这是一种特殊类型的对象 -
您可以拥有的最接近的是一个对象值已排序的数组。例如:
_valuesOfAnObjectSorted = Object.keys(object).map(function(k){ return object[k]; }).sort();
答案 1 :(得分:2)
您有两种可能性:
这样的事情:
var myObj = [
['type1', 'abc'],
['type2', 'gty'],
...
];
甚至更好,因为在某处使用它不会依赖于数组位置而是完全命名的键:
var myObj = [
{name: 'type1', val:'abc'},
{name: 'type2', val:'gty'},
...
];
无论您希望使用按键排序的对象,都可以将键提取为数组,对其进行排序并遍历它以访问对象
var ordKeys = Object.keys(myObj).sort(); // pass inside a function if you want specific order
var key;
for (var i = 0, len = ordKeys.length; i < len; i +=1) {
key = ordKeys[i]
alert(key + " - " + myObj[key]);
}
如果对象不是由您构造的,而是来自其他地方,则可以使用第二个选项方法来构造对象数组,如第一个选项中所示。这样可以让您在任何地方使用完美的订单。
您可能想要检查库underscore.js。在那里你有非常有用的方法,可以很容易地完成这个技巧。可能具有一些映射的方法_.pairs将在一个语句中完成所有工作。