IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> sort()排序方法纠正解析 -> 正文阅读

[游戏开发]sort()排序方法纠正解析

目录

1、arr.sort()基本理解

2、错误思想

3、返回顺序不正确的原因

4、正确实现

升序和降序的实现

对象数组排序

对非ASCII字符排序

使用映射改善排序


1、arr.sort()基本理解

  • arr.sort([compareFunction])此方法对数组元素进行排序

2、错误思想

在我们一般学习印象中sort函数可以直接对数组进行从小到大的默认排序。但是在一次动手输出的过程中,我发现此函数并没有按照预期将数组进行小到大的排序

//未正确排序的例子 -- 将其进行排序,但是未按小到大进行排序
var a = [4,2,56,13,5,2,33,11,4,5,6,7]
a.sort()
输出结果: [11, 13, 2, 2, 33, 4, 4, 5, 5, 56, 6, 7]

3、返回顺序不正确的原因

  • 当函数compareFunction省略时,则元素按照转换为的字符串的各个字符的Unicode位点进行排序 -- 将数组中的数字逐个转换为字符串,得到['4','2','56','13','5','2','33','11','4','5','6','7']。再按照首位字符的Unicode位点计算。1的编码在3之前,所以10和14排在3之后。4在5之前,所以44排在5之前
  • 如果首位字符的编码相同,则比较第二位字符的编码,比如 10 排在了 14之前(0 和 4 的比较结果)

4、正确实现

//正确排序的例子 -- 添加函数后实现小到大的排序
const arr = [2,3,11,4,3,542,222,8456,2121,0908,19999]
arr.sort((a,b) => a - b)
输出结果:[2, 3, 3, 4, 11, 222, 542, 908, 2121, 8456, 19999]

//此时数组相对于原数组进行改变
此时arr输出为:[2, 3, 3, 4, 11, 222, 542, 908, 2121, 8456, 19999]

升序和降序的实现

升序返回数组:arr.sort((a,b) => a - b)
降序返回数组:arr.sort((a,b) => b - a)

对象数组排序

var items = [
    {name: 'Edward', value: 21},
    {name: 'Sharpe', value: 37},
    {name: 'And', value: 45},
    {name: 'The', value: -12},
    {name: 'Magnetic'},
    {name: 'Zeros', value: 37}
];

// sort by value
items.sort(function (a, b) {
    return (a.value - b.value)
});
//按照sort by value进行排序输出的结果
[
  {name: 'The', value: -12}
  {name: 'Edward', value: 21}
  {name: 'Sharpe', value: 37}
  {name: 'And', value: 45}
  {name: 'Magnetic'}
  {name: 'Zeros', value: 37}
]

// sort by name
items.sort(function (a, b) {
    var nameA = a.name.toUpperCase(); // ignore upper and lowercase
    var nameB = b.name.toUpperCase(); // ignore upper and lowercase
    if (nameA < nameB) {
        return -1;
    }
    if (nameA > nameB) {
        return 1;
    }

    // names must be equal
    return 0;
});
//按照sort by name进行排序输出的结果
[
  {name: 'And', value: 45}
  {name: 'Edward', value: 21}
  {name: 'Magnetic'}
  {name: 'Sharpe', value: 37}
  {name: 'The', value: -12}
  {name: 'Zeros', value: 37}
]

对非ASCII字符排序

一些非英文的字符串进行排序们需要使用String.localeCompare函数进行排序

var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu'];
items.sort(function (a, b) {
	return a.localeCompare(b);
});
// 输出结果: items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']

使用映射改善排序

当元素多时,函数会有很大的负载。使用map进行辅助完成

//map辅助的原理:将数组中的每个元素比较的实际值取出来进行排序,排序完成之后再将数组进行恢复
// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
  	return { index: i, value: el.toLowerCase() };
})

// 按照多个值排序数组
mapped.sort(function(a, b) {
  	return +(a.value > b.value) || +(a.value === b.value) - 1;
});

// 根据索引得到排序的结果
var result = mapped.map(function(el){
  	return list[el.index];
});

借鉴链接:

JavaScript 中数组 sort() 方法的基本使用 - 掘金 (juejin.cn)

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:55:47  更:2022-03-22 20:58:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 7:46:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码