我有一个对象数组。
在每个对象中,我的目标是一个名为“myLevel”的属性。此属性的值在以下字符串语法中有所不同:
[
{myLevel : 'CAT I #4'},
{myLevel : 'CAT I #6'},
{myLevel : 'CAT I #2'},
{myLevel : 'CAT II #15'},
{myLevel : 'CAT III #1'},
{myLevel : 'CAT II #7'},
]
如何对数组进行排序,以便按升序重新排列对象:
[
{myLevel : 'CAT I #2'},
{myLevel : 'CAT I #4'},
{myLevel : 'CAT I #6'},
{myLevel : 'CAT II #7'},
{myLevel : 'CAT II #15'},
{myLevel : 'CAT III #1'}
]
答案 0 :(得分:1)
使用Array.sort,在传递的函数中,用#符号拆分字符串,将前半部分比作字符串,如果是偶数,则将后半部分作为int与call parseInt进行比较。
实际上,如果有很多记录,这将是缓慢的。您应该将记录存储为具有2个整数的对象,用于cat和level。 Thia将提高排序效率。您可以覆盖toString函数以您喜欢的方式显示它。
答案 1 :(得分:1)
使用RegEx匹配部件,然后单独检查这些部件
var arr = [
{myLevel : "CAT I #4"},
{myLevel : "CAT I #6"},
{myLevel : "CAT I #2"},
{myLevel : "CAT II #15"},
{myLevel : "CAT III #1"},
{myLevel : "CAT II #7"}
];
var sorted = arr.sort(function(a,b){
var left = a.myLevel.match(/CAT (I+) #([0-9]+)/);
var right = b.myLevel.match(/CAT (I+) #([0-9]+)/);
if(left[1].length==right[1].length){
return left[2]-right[2];
}else return left[1].length-right[1].length;
});
match
返回
[0] whole matched string
[1] all the `I`'s
[2] the number after the #
第一个if
是检查I
计数是否相同,如果是,我们需要检查数字。
如果我们需要检查数字,我们只需要返回它们之间的差异。
如果我们不需要检查数字,我们只需要返回I
的数量之间的差异
答案 2 :(得分:0)
将sort
与比较器一起使用。
// assume we want to have arbitrary roman numerals - we should have some form of lookup
var numeralLookup = {
I: 1,
II: 2,
III: 3,
IV: 4
} //etc
// helper function - parse Roman Numeral from your string
function getNumeral(str) {
return str.split()[1]
}
// helper function - parse number after '#' from your string
function getNumber(str) {
return parseInt(str.slice(str.indexOf('#') + 1))
}
// sort
arr.sort(function(a, b) {
var aNum = numeralLookup[getNumeral(a.myLevel)];
var bNum = numeralLookup[getNumeral(b.myLevel)];
return aNum === bNum ? getNumber(a.myLevel) - getNumber(b.myLevel) : aNum - bNum;
})
答案 3 :(得分:0)
不管你信不信,Array.sort的更快替代方案是Underscore的sortBy函数。查看their documentation here。图书馆有各种各样的实用工具来做这样的事情。
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}];
_.sortBy(stooges, 'name');
=> [{name: 'curly', age: 60}, {name: 'larry', age: 50}, {name: 'moe', age: 40}];