繁体   English   中英

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

[英]Javascript sort an array of strings that containing numbers

我正在尝试对有时包含数字的字符串数组进行排序。

以下是可能收到的数组示例和预期结果:

  • [“12W”、“60W”、“25W”] -> [“12W”、“25W”、“60W”]
  • [“IP67”、“IP68”、“IP20”] -> [“IP20”、“IP67”、“IP68”]
  • [“白色”、“红色”、“黑色”] -> [“黑色”、“红色”、“白色”]
  • ["100cm", "10cm", "50cm"] -> ["10cm","50cm","100cm"]
  • ["3000°K", "2700°K", "2000°K"] -> ["2000°K","2700°K","3000°K"]

这是我的实际代码: all_values 是我必须排序的数组。

const customSort = (a, b) => {
   return (Number(a.match(/(\d+)/g)[0]) - Number((b.match(/(\d+)/g[0])))
;};

const hasNumber = (myString) => {
   return /\d/.test(myString);};

// Sort filters
this.product.product_filter.map(filter => {
   if (hasNumber) {
      filter.all_values = filter.all_values.sort(customSort);
   } else {
      filter.all_values = filter.all_values.sort();}
});

在此先感谢您的帮助。

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
var myArray = ['1_Document', '11_Document', '2_Document'];
console.log(myArray.sort(collator.compare));

我相信您的问题在于您如何使用hasNumber 如果您将其用作条件,它将始终是真实的。 function中的 function 始终是真实的,这意味着您的第一个条件将始终得到满足,并且永远不会碰到您的else块。

我认为您正在查看是否可以将数组中的任何元素转换为数字。 在这种情况下,您需要检查整个数组。 这就是Array#someArray#every的设计目的。 根据您的要求,您可以:

  1. 检查数组中的每个元素是否可以转换为数字或
  2. 检查是否至少可以转换一个元素。

在任何一种情况下,您都在任何时间点检查单个字符串。 为了清楚起见,我相信hasNumber应该重命名为isNumber

const isNumber = (myString) => /\d/.test(myString);};
// ...
const hasNumber = filter.every(str => isNumber(str)) // if every element the array can be converted to a number
if (hasNumber) {

您可以在回调内部分支到Array.sort

1-如果元素包含数值,则根据这些值排序

2-else 按字母顺序排序

 function sortAlphaNumeric(arr) { return arr.sort((first,second) => { let re = /\d+/; if(re.test(first) && re.test(second)){ return parseInt(first.match(re) - parseInt(second.match(re))) } else{ return first.codePointAt(0) - second.codePointAt(0) } }) } console.log(sortAlphaNumeric(["12W", "60W", "25W"])) console.log(sortAlphaNumeric(["IP67", "IP68", "IP20"])) console.log(sortAlphaNumeric(["White", "Red", "Black"])) console.log(sortAlphaNumeric(["100cm", "10cm", "50cm"])) console.log(sortAlphaNumeric(["3000°K", "2700°K", "2000°K"]))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM