对包含数字和字符串的数组进行排序

20

我试图对包含字符串、数字和数字格式的字符串(例如'1'、'2')的数组进行排序。我希望对该数组进行排序,以便排序后的数组首先包含数字,然后是包含数字的字符串,最后是字符串。

var arr = [9,5,'2','ab','3',-1 ] // to be sorted
arr.sort()
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
//arr = [-1, "2", 5, 9, "ab"] // actual result

我还尝试过

var number =[];
var char =[];
arr.forEach(a=>{
 if(typeof a == 'number') number.push(a);
 else char.push(a);
})
arr = (number.sort((a,b)=> a>b)).concat(char.sort((a,b)=> a>b))
// arr = [-1, 5, 9, "2", "3","ab"] // expected result
//  arr = [-1, 5, 9, "2", "ab", "3"]// actual result

“2”和“3”在“9”之后有什么原因吗?对于这种排序,您可以进行两次排序或进行单个唯一复杂排序。 - briosheje
因为它们是字符串。看起来 OP 想要的是首先是数字,然后是字符串。 - ksav
2
"@briosheje",由于它们是字符串,所以"2"和 "3"在9之后。因此,顺序是[整数,整数字符串,非数字字符串] - Nick Parsons
“数字字符串”应该如何排序?作为数字还是作为字符串? - Jonas Wilms
12个回答

0

var myArray = [9, 5, '2', 'ab', '3', -1]
myArray.sort((a, b) => {
  let aTest = /^\d+$/.test(a);
  let bTest = /^\d+$/.test(b);
  if (aTest && bTest) {
    return parseInt(a) - parseInt(b);
  } else if (aTest) {
    return -1;
  } else if (bTest) {
    return 1;
  } else {
    return a > b ? 1 : -1;
  }
})

console.log(myArray)


0
有点粗糙,但应该能适当地完成任务。

var mixedArray = ["a", "5", "1", "-1", 17, "abc", 23, -5, 0, "17"];

const mixedSort = (arra) => {
  arra.sort();
  return arra.sort((a, b) => {
    if (typeof a === "string" && typeof b === "string") {
      if (Number(a) < Number(b)) return -1;
      return 1;
    }
    if (typeof a === "string") {
      return 1;
    }
    if (typeof b === "string") {
      return -1;
    }
  });
};
console.log(mixedSort(mixedArray));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接