对象数组排序

网上看到这样一个问题:

1
2
3
4
5
6
7
8
9
10
var objArr = [{
'a': 999,
'b': 888
}, {
'a': 123,
'b': 345,
'c': 345
}, {
'a': 666
}]

请把以上的对象数组,根据数组每项属性个数的多少排序,使其转化为

1
2
3
4
5
6
7
8
9
10
var objArr = [{
'a': 666
},{
'a': 999,
'b': 888
},{
'a': 123,
'b': 345,
'c': 345
}]

我想了挺久才解决,思路是给每项对象挂上一个新属性(表示对象属性的个数),再利用 sort() 函数来进行排序,最后把该属性去掉。代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*获得对象属性的个数*/
Object.prototype.getProperNum = function() {
var propNum = 0;
for (var i in this) {
++propNum
};
return propNum
};

/*给对象添加properNum的属性*/
for (var i = 0; i < objArr.length; i++) {
var num = objArr[i].getProperNum()
objArr[i]['properNum'] = num
};

/*比较函数*/
var compare = function(obj1, obj2) {
var val1 = obj1.properNum;
var val2 = obj2.properNum;
return val1 - val2 //升序
}

var objArr2 = objArr.sort(compare)

for (var i = 0; i < objArr2.length; i++) {
delete objArr2[i].proper
};

console.log(objArr2)