如何按字符串值对数组中的对象数组进行排序?

时间:2016-07-27 00:44:39

标签: javascript arrays sorting

我有一个对象数组。

在每个对象中,我的目标是一个名为“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'}
   ] 

4 个答案:

答案 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}];