我有一个Javascript对象,其中包含各种属性类型,包括简单字符串,对象,对象数组......等等。
我想按照这条规则对键进行排序:
'字符串或数字等简单属性总是出现在包含数组或对象的更复杂属性
之前我编写了以下函数,它几乎完成了我想要实现的功能,但它将数组转换为对象。这不是理想的行为。任何人都可以帮我创建一个函数,将数组保持为数组,同时对数组中的对象进行排序吗?
function sort(object){
if (typeof object != "object" )
return object;
var keys = Object.keys(object);
keys.sort(function(a,b){
if (typeof(object[a])!== 'object') { return -1 } else { return 1 }
});
工作jsfiddle:
http://jsfiddle.net/u01mn2py/3/
亲切的问候
答案 0 :(得分:4)
从ECMAScript 2015(ES6)开始,某个操作的对象拥有属性do have order,但依赖它很少是一个好主意。如果您想订购,通常最好使用阵列或类似产品。
订单是:
- 让键成为新的空列表。
- 对于作为整数索引的 O 的每个自有属性键 P ,按升序数字索引顺序
- 添加 P 作为键的最后一个元素。
- 对于 O 的每个属性键 P ,它是一个String但不是整数索引,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 对于作为符号的 O 的每个属性键 P ,在属性创建顺序中
- 添加 P 作为键的最后一个元素。
- 返回键。
醇>
"拥有"属性。我不认为有任何外部可用的操作定义了包括继承属性在内的所有属性的必需顺序。 (for-in
无需遵循上述顺序,即使在ES2015 +中也不例外。)
这意味着,如果我们的密钥没有一个符合整数索引的条件,那么它可能可以在兼容的引擎上执行您的要求。
JSON仍然没有订单,但JavaScript规范要求JSON.stringify
使用上述顺序。
我不是说我建议它。 : - )
function sort(object) {
// Don't try to sort things that aren't objects
if (typeof object != "object") {
return object;
}
// Don't sort arrays, but do sort their contents
if (Array.isArray(object)) {
object.forEach(function(entry, index) {
object[index] = sort(entry);
});
return object;
}
// Sort the keys
var keys = Object.keys(object);
keys.sort(function (a, b) {
var atype = typeof object[a],
btype = typeof object[b],
rv;
if (atype !== btype && (atype === "object" || btype === "object")) {
// Non-objects before objects
rv = atype === 'object' ? 1 : -1;
} else {
// Alphabetical within categories
rv = a.localeCompare(b);
}
return rv;
});
// Create new object in the new order, sorting
// its subordinate properties as necessary
var newObject = {};
keys.forEach(function(key) {
newObject[key] = sort(object[key]);
});
return newObject;
}
实例(我也是updated the fiddle):
function sort(object) {
// Don't try to sort things that aren't objects
if (typeof object != "object") {
return object;
}
// Don't sort arrays, but do sort their contents
if (Array.isArray(object)) {
object.forEach(function(entry, index) {
object[index] = sort(entry);
});
return object;
}
// Sort the keys
var keys = Object.keys(object);
keys.sort(function (a, b) {
var atype = typeof object[a],
btype = typeof object[b],
rv;
if (atype !== btype && (atype === "object" || btype === "object")) {
// Non-objects before objects
rv = atype === 'object' ? 1 : -1;
} else {
// Alphabetical within categories
rv = a.localeCompare(b);
}
return rv;
});
// Create new object in the new order, sorting
// its subordinate properties as necessary
var newObject = {};
keys.forEach(function(key) {
newObject[key] = sort(object[key]);
});
return newObject;
}
var object = {
family: [{
home: {
city: 'Madrid'
},
birth: {
city: 'Madrid'
},
name: 'John',
age: 32
}, {
home: {
city: 'London'
},
birth: {
city: 'Paris'
},
name: 'Marie',
age: 25
}],
name: 'Dani',
age: 33
};
var sortedObject = sort(object);
document.getElementById('container').innerHTML = JSON.stringify(sortedObject, null, '\t');

<pre id="container">
</pre>
&#13;
(你没有在类别中要求按字母顺序排列,但投入它似乎是合理的。)
这适用于我当前的Chrome,Firefox和IE11。
答案 1 :(得分:0)
我知道我无法按照javascript属性顺序进行中继,但我需要在视觉上显示已排序的JSON。以这种方式解决:
http://jsfiddle.net/u01mn2py/4/
function sort(object){
if (typeof object != "object" ) // Not to sort the array
return object;
var keys = Object.keys(object);
keys.sort(function(a,b){
if (typeof(object[a])!== 'object') { return -1 } else { return 1 }
});
if( Object.prototype.toString.call( object ) === '[object Array]' ) {
var newObject = [];
} else {
var newObject = {}; }
for (var i = 0; i < keys.length; i++){
newObject[keys[i]] = sort(object[keys[i]])
}
return newObject;
}