Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 43 题:使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果

Open HankXu opened this issue 6 years ago • 42 comments

原题目:

使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果

我的答案:

[102, 15, 22, 29, 3, 8]

解析:

根据MDN上对Array.sort()的解释,默认的排序方法会将数组元素转换为字符串,然后比较字符串中字符的UTF-16编码顺序来进行排序。所以'102' 会排在 '15' 前面。以下是MDN中的解释原文:

The sort() method sorts the elements of an array in place and returns the array. The default sort order is built upon converting the elements into strings, then comparing their sequences of UTF-16 code units values.

HankXu avatar Mar 28 '19 01:03 HankXu

[3, 15, 8, 29, 102, 22].sort(function(a,b) { return a-b; }) 输出: [3, 8, 15, 22, 29, 102]

bidepanbeibei avatar Mar 28 '19 01:03 bidepanbeibei

[3, 15, 8, 29, 102, 22].sort((a, b) => b - a) // [102, 29, 22, 15, 8, 3]

buyouzzj avatar Mar 28 '19 01:03 buyouzzj

[3, 15, 8, 29, 102, 22].sort((a, b) => a - b) // [3, 8, 15, 22, 29, 102]

jefferyE avatar Mar 28 '19 01:03 jefferyE

[3, 15, 8, 29, 102, 22].sort((a,b)=>b-a) 要是js 出个sortAsc 和 sortDsc 就更易读懂了

shawnxu15 avatar Mar 28 '19 01:03 shawnxu15

[3, 15, 8, 29, 102, 22].sort((a,b) => {return a - b;});

zeroone001 avatar Mar 28 '19 01:03 zeroone001

let arr = [3, 15, 8, 29, 102, 22] arr.sort((a, b) => { return a - b }) console.log(arr) a-b输出从小到大排序,b-a输出从大到小排序。

DeronEndless avatar Mar 28 '19 01:03 DeronEndless

[3, 15, 8, 29, 102, 22] .sort((a,b) => a-b) // [3,8,15,22,29,102] [3, 15, 8, 29, 102, 22] sort((a,b) => b-a) //[102, 29, 22, 15, 8, 3]

Rashomon511 avatar Mar 28 '19 01:03 Rashomon511

sort 函数,可以接收一个函数,返回值是比较两个数的相对顺序的值

  1. 默认没有函数 是按照 UTF-16 排序的,对于字母数字 你可以利用 ASCII 进行记忆
 [3, 15, 8, 29, 102, 22].sort();

// [102, 15, 22, 29, 3, 8]
  1. 带函数的比较
 [3, 15, 8, 29, 102, 22].sort((a,b) => {return a - b});
  • 返回值大于0 即a-b > 0 , a 和 b 交换位置
  • 返回值大于0 即a-b < 0 , a 和 b 位置不变
  • 返回值等于0 即a-b = 0 , a 和 b 位置不变

对于函数体返回 b-a 可以类比上面的返回值进行交换位置

jjeejj avatar Mar 28 '19 01:03 jjeejj

let arr = [3, 15, 8, 29, 102, 22]; let newArr = arr.sort((a,b)=>{ return a - b; }) console.log(newArr) 不知道你要正序还是倒叙,而且这个面试题有点简单

zxcweb avatar Mar 28 '19 01:03 zxcweb

let ary = [3, 15, 8, 29, 102, 22] ary.sort() // 输出结果为[102, 15, 22, 29, 3, 8],原因是因为sort()默认根据字符编码排序

lxinr avatar Mar 28 '19 02:03 lxinr

arr.sort((a,b) =>{ return a-b })

hmmoshang avatar Mar 28 '19 02:03 hmmoshang

arr.sort((a,b)=>a-b)

JerryWang1996 avatar Mar 28 '19 04:03 JerryWang1996

应该默认没有回调函数的,[102, 15, 22, 29, 3, 8]

1998yyh avatar Mar 28 '19 06:03 1998yyh

image let numTest = [3, 15, 8, 29, 102, 22]; numTest.sort((a,b) => { return a-b })

zhaiyongtao avatar Mar 28 '19 06:03 zhaiyongtao

[3, 15, 8, 29, 102, 22].sort(); 
// [102, 15, 22, 29, 3, 8]

[3, 15, 8, 29, 102, 22].sort((a, b) => a-b);
// [3, 8, 15, 22, 29, 102]

taseikyo avatar Mar 28 '19 07:03 taseikyo

[3, 15, 8, 29, 102, 22].sort((a,b) => a-b)

JerryLin233 avatar Mar 28 '19 07:03 JerryLin233

[3, 15, 8, 29, 102, 22].sort((a, b) => { return a-b })  // [3, 8, 15, 22, 29, 102]

lovelmh13 avatar Mar 28 '19 07:03 lovelmh13

`/*

  • @Author:max bai @Date:2019/3/28 @Last Modified by :max bai @Last Modiified time:2019/3/28

dailyIssue:1 使用 sort() 对数组 [3, 15, 8, 29, 102, 22] 进行排序,输出结果 */ let arr=[102, 15, 22, 29, 3, 8]; let reSort={ desSort:function(arr){ let arrTemp=arr; let result =arrTemp.sort(function(a,b){ return b-a; }); console.log(result); return result; }, incSort:function (arr){ let arrTemp=arr; let result=arrTemp.sort(function(a,b){ return a-b; }); console.log(result); return result; }

}

let a=new Array(); let b=new Array(); // 数组赋值方法:1:newArr = [...arr]; 或者2:newArr = arr.slice(0); a=reSort.desSort(arr).slice(0); b=reSort.incSort(arr).slice(0); console.log(a); console.log(b); // 打印结果: // [102, 29, 22, 15, 8, 3] // [3, 8, 15, 22, 29, 102] // [102, 29, 22, 15, 8, 3] // [3, 8, 15, 22, 29, 102] `

GeekQiaQia avatar Mar 28 '19 08:03 GeekQiaQia

var arr = [3, 15, 8, 29, 102, 22]; 
arr.sort()
// [102, 15, 22, 29, 3, 8]

arr.sort([compareFunction]) compareFunction 用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

fisher-zh avatar Mar 28 '19 11:03 fisher-zh

Array.prototype.sortAsc=function(){return this.sort((a,b)=>a-b)}; Array.prototype.sortDesc=function(){return this.sort((a,b)=>b-a)}; [3, 15, 8, 29, 102, 22].sortAsc(); [3, 15, 8, 29, 102, 22].sortDesc();

uniume1 avatar Mar 28 '19 13:03 uniume1

let arr = [2, 15, 8, 29, 102, 22]; arr.sort (( a, b ) => { return b - a; }) console.log(arr); // [ 102, 29, 22, 15, 8, 2 ]

mike199808 avatar Mar 29 '19 00:03 mike199808

var arr =  [3, 15, 8, 29, 102, 22]
arr.sort((num1, num2) => num1 - num2)

aeolusheath avatar Mar 29 '19 06:03 aeolusheath

从小到大 [3, 15, 8, 29, 102, 22].sort((a,b) => a-b) 从大到小 [3, 15, 8, 29, 102, 22].sort((a,b) => b-a)

zhyat avatar Mar 30 '19 08:03 zhyat

补充一个奇怪的,在新版本的chrome和node中, 这样是不能排序的

[3, 15, 8, 29, 102, 22].sort((a,b) => (b > a))

Safari中是OK的

zeroone001 avatar Apr 07 '19 23:04 zeroone001

补充一个奇怪的,在新版本的chrome和node中, 这样是不能排序的

[3, 15, 8, 29, 102, 22].sort((a,b) => (b > a))

Safari中是OK的

这个是可以的,这是箭头函数的写法

image

jjeejj avatar Apr 09 '19 01:04 jjeejj

[3, 15, 8, 29, 102, 22].sort( (a,b) =>{ if(a - b){ return 1 }else{ return -1 } })

ss7758258 avatar Apr 16 '19 07:04 ss7758258

[3,15,8,29,102,22] .sort(function(a,b){ return ab; }) 输出:[3,8,15,22,29,102]

漂亮 小姐姐

LwDsmile avatar Apr 18 '19 02:04 LwDsmile

[3, 15, 8, 29, 102, 22].sort() // [102, 15, 22, 29, 3, 8]
[3, 15, 8, 29, 102, 22].sort((a, b) => a - b) //  [3, 8, 15, 22, 29, 102]
[3, 15, 8, 29, 102, 22].sort((a, b) => b - a) // 

rongda avatar Jul 09 '19 03:07 rongda

你们真是一群妖怪

fariellany avatar Jul 30 '19 08:07 fariellany

[3,15,8,29,102,22].sort((a,b)=>a-b) //output [3,8,15,22,29,102]

Cillivian avatar Aug 12 '19 05:08 Cillivian

arr.sort() 等同于 arr.sort( (a , b) => a.charCodeAt() - b.charCodeAt() )

K-walker avatar Aug 21 '19 08:08 K-walker

看起来头像对点赞数影响很大

miaogulu avatar Aug 30 '19 08:08 miaogulu

[3, 15, 8, 29, 102, 22].sort((a,b)=>{ return a-b })

ljh15191849190 avatar Sep 20 '19 07:09 ljh15191849190

补充一个奇怪的,在新版本的chrome和node中, 这样是不能排序的

[3, 15, 8, 29, 102, 22].sort((a,b) => (b > a))

Safari中是OK的

这个是可以的,这是箭头函数的写法

image

chrome中尝试了,的确不行,不知道什么原因

yuebaiqinghui avatar Nov 20 '19 02:11 yuebaiqinghui

补充一个奇怪的,在新版本的chrome和node中, 这样是不能排序的

[3, 15, 8, 29, 102, 22].sort((a,b) => (b > a))

Safari中是OK的

这个是可以的,这是箭头函数的写法 image

chrome中尝试了,的确不行,不知道什么原因

这种用法是不符合规范的,compareFunction 的返回值会和0作比较,引用MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。 compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

simon5057 avatar Nov 22 '19 07:11 simon5057

02-使用sort() 对数组进行排序 - 【3,15,8,29,102,22】

mdn 上的sort

sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

00.png

采用的utf-16 ,常见的字符数字 英语大小写 汉字

let arrs = ['你好啊','HELLO','hello',666]
arrs.sort()
console.log(arrs)  // [666, "HELLO", "hello", "你好啊"]

总结

数字》英语大写》英语小写》汉字

	/**
     * Sorts an array.
     * @param compareFn Function used to determine the order of the elements. It is expected to return
     * a negative value if first argument is less than second argument, zero if they're equal and a positive
     * value otherwise. If omitted, the elements are sorted in ascending, ASCII character order.
     * ```ts
     * [11,2,22,1].sort((a, b) => a - b)
     * ```
     */
    sort(compareFn?: (a: T, b: T) => number): this;
  • 阮老师 字符编码

  • 步骤

    • 转为字符串 数字>英语大写>英语小写>汉字

    01.png

    • 对比第一个字符===>15 102 29 22 3 8
    • 对比第二个字符===>102 15 22 29 3 8
    • 对比第三个字符===>102 15 22 29 3 8
  • 案例

arr.sort((x, y) => {
  console.log(`排序:${x}----${y}`);
});
排序:15----3
排序:8----15
排序:29----8
排序:102----29
排序:22----102
arr.sort((x, y) => {
  console.log(`${x}-${y}=${x - y}`);
});
15-3=12
8-15=-7
29-8=21
102-29=73
22-102=-80
arr.sort((x, y) => {
  console.log(`${x}-${y}=${x - y}`);
  return x - y;
});
console.log(arr);
15-3=12
8-15=-7
8-15=-7
8-3=5
29-8=21
29-15=14
102-15=87
102-29=73
22-15=7
22-102=-80
22-29=-7
[ 3, 8, 15, 22, 29, 102 ]
  • 总结
    • 返回值小于 0 x 移动到 y 前 升序 return x-y
    • 返回值大于 0 x 移动到 y 后 降序 return y-x
    • 返回值等于 0 大多浏览器相对不变
  • 结果:

[ 102, 15, 22, 29, 3, 8 ]

yayxs avatar Apr 21 '20 15:04 yayxs

sort(): [102, 15, 22, 29, 3, 8] sort((a,b)=> a-b): [3, 8, 15, 22, 29, 102]

long-joan avatar May 22 '20 09:05 long-joan

[3, 15, 8, 29, 102, 22].sort(new Function(a,b,b-a))

xiaobian233 avatar Jun 15 '20 02:06 xiaobian233

var arr2 = ['b','a','c','d','o'] arr2.sort()

输出["a", "b", "c", "d", "o"],因为没有函数时会进行UTF-16编码的比较,小的排前面, 当需要对数字从大到小排序时,一般要加入函数

var arr = [3, 15, 8, 29, 102, 22];
arr.sort((a,b)=>a-b);

a-b小于0时,会把a和b的位置互换,所以这样排序会把大的数放后面,小的放前面 题目对数字直接用了sort(),没有加函数,会进行UTF-16编码的比较, 所以答案是: [102, 15, 22, 29, 3, 8]

soraly avatar Jun 22 '20 06:06 soraly

let arr = [3, 15, 8, 29, 102, 22]; let newArr = arr.sort((a,b)=>{ return a - b; }) console.log(newArr) 不知道你要正序还是倒叙,而且这个面试题有点简单 你没理解题目意思哦亲

635864859 avatar Jul 09 '21 05:07 635864859

默认按字符的 utf-16 编码进行比较 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

Yangfan2016 avatar Aug 04 '22 12:08 Yangfan2016

这是来自QQ邮箱的假期自动回复邮件。你好,我最近正在休假中,无法亲自回复你的邮件。我将在假期结束后,尽快给你回复。

zhaiyongtao avatar Aug 04 '22 12:08 zhaiyongtao