JS数组sort方法与随机排序、中文排序

一、JS数组sort方法

1.基本用法:

// 升序
return a - b;
// 倒序
return b - a;
var arr = [2,34,242,12,3,2,23,3];// 定义一个数组 arr.sort(function (a,b) { // a -->代表每一次执行匿名函时候,找到的数组中的当前项; // b -->代表当前项的后一项; return a - b; // 升序时: 如果a>b,那么返回的值>0,a和b交换位置; return b - a; // 降序时: 如果b>a,那么返回的值>0,a和b交换位置; //-> 原理:return的值可能是一个大于0的数也或者可能是小于等于0的数,如果return后的值大于0则让数组a和b交换一下位置;小于等于0,则原来数组中的位置不变; return 1; // 表示不管a和b谁大,每一次都返回一个恒大于0的数,也就是说每一次a和b都要交换位置,最后的结果就是原有数组倒过来排列了,相当于数组的reverse()方法; })

按照Unicode编码排序。

2.sort(compare)原理描述:

可选参数compare需为函数,sort函数使用compare函数比较数组中的两个元素,因此,compare函数需要两个参数—compare(a,b)。
当compare函数返回任何大于0的值时,它将使第1个参数的索引值小于第2个参数的索引值
当compare函数返回任何小于0的值时,它将使第2个参数的索引值小于第1个参数的索引值

理解:

sort()方法在比较时,其内部逻辑是如此的:从数组内索引值为0和1的参数开始比较(即参数a和b),比较结果没有变动的话,继续比较索引值1和2的,如果结果有变化,变换两者的位置(索引值),并判断之前有无其他参数,如果有的话则会对参数a和a之前的参数进行比较。如果没有则用参数b与索引值+1的参数比较。遵循此逻辑重复循环操作,完成排序。

元素为对象:
  var items = [
      { name: "Edward", age: 21 },
      { name: "Sharpe", age: 37 },
      { name: "And", age: 45 },
      { name: "The", age: -12 },
      { name: "Magnetic", age: 0 },
      { name: "Zeros", age: 37 },
  ];
  items.sort((a, b) => {
      return a.age - b.age;
  });
  console.log(items);

二、数组随机排序

1、sort随机排序(Array.prototype.sort 随机排序,结果并不均匀,并不完全随机)

function randomsort(a, b) {
  return Math.random()>.5 ? -1 : 1; //通过随机产生0到1的数,然后判断是否大于0.5从而影响排序,产生随机性的效果。
}
var arr = [1, 2, 3, 4, 5];
arr.sort(randomsort);

2、经典随机排序

1.
function shuffle(arr){
  var len = arr.length;
  for(var i = 0; i < len - 1; i++){
    var idx = Math.floor(Math.random() * (len - i));
    var temp = arr[idx];
    arr[idx] = arr[len - i - 1];
    arr[len - i -1] = temp;
  }
  return arr;
}

2.
var arr =[1,2,3,4];
var t;
for(var i = 0;i < arr.length; i++){
 var rand = parseInt(Math.random()*arr.length);
   t = arr[rand];
   arr[rand] =arr[i];
   arr[i] = t;
}
console.log(arr);

三、中文排序

1.localeCompare() 方法

js提供了字符串的对比方法localeCompare(),该方法返回的是一个数字用来表示一个参考字符串和对比字符串是排序在前,在后或者相同,默认的本地排序规则。该方法基本不单独使用,大部分时间是配合字符串排序使用的。

  • 如果 stringObject 小于 target,则 localeCompare() 返回小于 0 的数。
  • 如果 stringObject 大于 target,则该方法返回大于 0 的数。
  • 如果两个字符串相等,或根据本地排序规则没有区别,该方法返回 0。
stringObject.localeCompare(target)

语法

localeCompare(compareString)
localeCompare(compareString, locales)
localeCompare(compareString, locales, options)
  • locales 可选。表示缩写语言代码(BCP 47 language tag)的字符串,或由此类字符串组成的数组。对应于 Intl.Collator() 构造函数的 locales 参数。在不支持 Intl.Collator 的实现中,该参数会被忽略,并且通常会使用主机的区域设置。

  • options 可选。一个调整输出格式的对象。对应于 Intl.Collator() 构造函数的 options 参数。在不支持 Intl.Collator 的实现中,该参数会被忽略。

例子:

var str = 'aaa',
    strCom = 'bbb',
    strCom2 = 'aaa';
str.localeCompare(strCom); //-1
strCom.localeCompare(str); //1
str.localeCompare(strCom2); //0

2.localeCompare()结合sort方法

ar strList = ['cc', 'ee', 'ca', 'aa'];
 
strList.sort((a, b) => {
    return a.localeCompare(b);
});
console.log(strList);   //["aa", "ca", "cc", "ee"]

3.中文排序

例子1:

let arr = ["贵州省", "江苏省", "江西省", "浙江省", "四川省", "安徽省", "山东省", "上海", "湖北省", "福建省", "辽宁省", "山西省", "河北省", "青海省",

"黑龙江省", "内蒙古自治区", "北京", "河南省", "湖南省", "广东省", "陕西省", "吉林省", "云南省", "新疆维吾尔自治区",

"重庆", "天津", "甘肃省", "宁夏回族自治区", "海南省", "广西壮族自治区", "西藏自治区"];

let sortArray = arr.sort(function (str1, str2) {
  return str1.localeCompare(str2, 'zh');
});

// 输出 ['安徽省', '北京', '重庆', '福建省', '甘肃省', '广东省', '广西壮族自治区', '贵州省', '海南省', '河北省', '河南省', '黑龙江省', '湖北省', '湖南省', '吉林省', '江苏省', '江西省', '辽宁省', '内蒙古自治区', '宁夏回族自治区', '青海省', '山东省', '山西省', '陕西省', '上海', '四川省', '天津', '西藏自治区', '新疆维吾尔自治区', '云南省', '浙江省']

例子2:

['张三','李四','王五'].sort((a, b) => a.localeCompare(b, 'zh-Hans-CN', {sensitivity: 'accent'}))

// 输出 ['李四','王五','张三']

zh-Hans-CN是简体中文的排序规则;

sensitivity

字符串中的哪些差异应导致结果值为非零。可能的值为:

  • "base":只有字母不同的字符串比较不相等。例如:a ≠ b、a = á、a = A。
  • "accent":只有不同的基本字母或重音符号和其他变音符号的字符串比较为不相等。例如:a ≠ b、a ≠ á、a = A。
  • "case":只有不同的基本字母或大小写的字符串比较不相等。例如:a ≠ b、a = á、a ≠ A。
  • "variant":字符串的字母、重音和其他变音符号,或不同大小写比较不相等。也可以考虑其他差异。例如:a ≠ b、a ≠ á、a ≠ A。

"sort" 用法(usage)的默认值为 "variant""search" 用法则取决于区域。

参考:https://blog.csdn.net/u013680938/article/details/51487112

posted @ 2020-12-03 15:52  盼星星盼太阳  阅读(1195)  评论(0)    收藏  举报