首页 > 其他分享 >JS sort排序方法

JS sort排序方法

时间:2023-06-29 18:12:27浏览次数:37  
标签:sort undefined 元素 JS 数组 排序 compareFn

Array.prototype.sort()

sort() 方法就地对数组的元素进行排序,并返回对相同数组的引用。默认排序是将元素转换为字符串,然后按照它们的 UTF-16 码元值升序排序。

由于它取决于具体实现,因此无法保证排序的时间和空间复杂度。

尝试一下

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// Expected output: Array ["Dec", "Feb", "Jan", "March"]

const array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
// Expected output: Array [1, 100000, 21, 30, 4]


语法

JSCopy to Clipboard

sort()
sort(compareFn)

参数

  • compareFn 可选

    定义排序顺序的函数。返回值应该是一个数字,其正负性表示两个元素的相对顺序。该函数使用以下参数调用:a第一个用于比较的元素。不会是 undefinedb第二个用于比较的元素。不会是 undefined。如果省略该函数,数组元素会被转换为字符串,然后根据每个字符的 Unicode 码位值进行排序。

返回值

经过排序的原始数组的引用。注意数组是就地排序的,不会进行复制。

描述

如果没有提供 compareFn,所有非 undefined 的数组元素都会被转换为字符串,并按照 UTF-16 码元顺序比较字符串进行排序。例如“banana”会被排列到“cherry”之前。在数值排序中,9 出现在 80 之前,但因为数字会被转换为字符串,在 Unicode 顺序中“80”排在“9”之前。所有的 undefined 元素都会被排序到数组的末尾。

sort() 方法保留空槽。如果源数组是稀疏的,则空槽会被移动到数组的末尾,并始终排在所有 undefined 元素的后面。

备注: 在 UTF-16 中,Unicode 字符超出 \uFFFF 的范围会被编码为两个代理码元(surrogate code unit),这些码位的范围是 \uD800\uDFFF。每个码位的值都会被单独考虑进行比较。因此,由代理对 \uD855\uDE51 组成的字符将排在字符 \uFF3A 的前面。

如果提供了 compareFn,所有非 undefined 的数组元素都会按照比较函数的返回值进行排序(所有的 undefined 元素都会被排序到数组的末尾,并且不调用 compareFn)。

compareFn(a, b) 返回值 排序顺序
> 0 ab 后,如 [b, a]
< 0 ab 前,如 [a, b]
=== 0 保持 ab 原来的顺序

所以,比较函数形式如下:

JSCopy to Clipboard

function compareFn(a, b) {
  if (根据排序标准,a 小于 b) {
    return -1;
  }
  if (根据排序标准,a 大于 b) {
    return 1;
  }
  // a 一定等于 b
  return 0;
}

更正式地说,为了确保正确的排序行为,比较函数应具有以下属性:

  • 纯函数:比较函数不会改变被比较的对象或任何外部状态。(这很重要,因为无法保证比较函数将在何时以及如何调用,因此任何特定的调用都不应对外部产生可见的效果。)
  • 稳定性:比较函数对于相同的输入对应始终返回相同的结果。
  • 自反性compareFn(a, a) === 0
  • 反对称性compareFn(a, b)compareFn(b, a) 必须都是 0 或者具有相反的符号。
  • 传递性:如果 compareFn(a, b)compareFn(b, c) 都是正数、零或负数,则 compareFn(a, c) 的符号与前面两个相同。

标签:sort,undefined,元素,JS,数组,排序,compareFn
From: https://www.cnblogs.com/galaxy9/p/17514905.html

相关文章

  • js原生方法:获取某个元素所处屏幕的位置,input输入框中文输入时的调用
    span.getBoundingClientRect()会返回改元素的位置信息//输入框内容改变functioninputSearchChange(){//如果是拼音输入,则会进入这个监听inputSearch.addEventListener('compositionstart',()=>{lastInputValue=inputSearch.valueisPinyin=true}......
  • 带头结点单链表插入,删除,查找与排序实现一个简单的基于链表结构的学生管理系统
    链表结构和操作方法////CreatedbyAdministratoron2023/6/12.//#ifndefCODE_LINKEDLIST_H#defineCODE_LINKEDLIST_H#include<iostream>#include<cstring>#include<stdlib.h>#include"student.h"typedefstructlink_list{//......
  • JSTL-foreach
     <%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><%@pagecontentType="text/html;charset=UTF-8"language="java"%><!DOCTYPEhtml><htmllang="en"><head>......
  • js小练习
    写一个函数,计算两个数字的和functionadd(a,b){console.log(a+b)}add(2,3)判断一个数字是否是偶数functionouShu(a){if(a%2===0){console.log(a+'是偶数')}else{console.log(a+'是奇数')}}ouShu(155)找出一个数组中的最大值并......
  • js随笔
    JavaScript(缩写:JS)是一门完备的动态编程语言。当应用于HTML文档时,可为网站提供动态交互特性。由布兰登·艾克(BrendanEich,Mozilla项目、Mozilla基金会和Mozilla公司的联合创始人)发明。JavaScript的应用场合极其广泛,简单到幻灯片、照片库、浮动布局和响应按钮点击,复杂到游戏......
  • C# 序列化大小写 序列化对象为大小写 JsonConvert.SerializeObject
    关于C#序列化Json对象框架:.Net插件:Newtonsoft.Json最近有人问我序列化对象还区分大小写?我当时心想我都是通过Bejson格式化然后转换为C#类然后直接复制。没有关心过序列化成什么大小写。因为这样的话可以保持一致。直到有人问我才自己研究了一下。如下:usingNewtonsoft.......
  • JSTL-if
      <%--CreatedbyIntelliJIDEA.User:adminDate:2023/6/29Time:16:29TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/html;charset=UTF-8"language="java"%><......
  • JSP-脚本-案例
     <%@pageimport="com.itheima.pojo.Brand"%><%@pageimport="java.util.ArrayList"%><%@pageimport="java.util.List"%><%--CreatedbyIntelliJIDEA.User:adminDate:2023/6/29Time:15:31......
  • 带有 Spring Boot 后端的 Vue.js 前端
    概述在开始本教程中,先推荐1个SpringBoot+Vue前后端分离Java项目,本项目是一个大型互联网金融项目,采用SpringBoot,Dubbo微服务的架构,包括多个独立的微服务,micr-common个公共服务,micr-web服务,micr-database数据库服务,micr-pay支付服务,micr-task定时任务。前端技术栈:Vue,Java......
  • json.NewEncoder的用法
    写get或post的api接口时需要注意什么?在编写GET或POST的API接口时,有一些注意事项需要考虑,以确保接口的正确性和安全性:路由和路径参数:在设计API接口时,需要选择合适的路由和路径参数来表示资源的唯一标识符或其他参数。确保路径参数的命名清晰明确,遵循RESTful设计原则。请求方......