gpt4 book ai didi

javascript - Array.prototype.sort 默认比较函数如何实现?

转载 作者:行者123 更新时间:2023-11-29 23:31:13 29 4
gpt4 key购买 nike

背景

我需要实现一个与 Array.prototype.sort 的默认比较函数具有相同行为的函数

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

阅读文档后我偶然发现了这个:

The default sort order is according to string Unicode code points.

这是什么意思?这是否意味着我将每个对象都转换为字符串?

如果是这样,假设我有数组 [2, "a", { hello: "world"}] 这些步骤是否正确?

  1. [2, "a", { hello: "world"}] 转换为 ["2", "a", '{ hello: "world"}']
  2. 将每个字符串的第一个字符转换为数字
  3. 按那个号码下单

问题

我如何实现给定任何对象的比较函数,其行为与排序中的比较函数完全相同?

注意事项

阅读 ECMA 规范:

我现在相信如果 comparefnundefined,那么他们默认使用这个算法:

http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare

有人可以确认吗?

最佳答案

解决方案

在阅读了 ECMA 规范并四处询问之后,我找到了一个模拟 Array.prototype.sort() 在 chrome 中的默认行为的 defaultCompare 函数:

const defaultCompare = ( x, y ) => {
//INFO: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
//ECMA specification: http://www.ecma-international.org/ecma-262/6.0/#sec-sortcompare

if( x === undefined && y === undefined )
return 0;

if( x === undefined )
return 1;

if( y === undefined )
return -1;

const xString = toString(x);
const yString = toString(y);

if( xString < yString )
return -1;

if( xString > yString )
return 1;

return 0;
};

const toString = obj => {
//ECMA specification: http://www.ecma-international.org/ecma-262/6.0/#sec-tostring

if( obj === null )
return "null";

if( typeof obj === "boolean" || typeof obj === "number" )
return (obj).toString();

if( typeof obj === "string" )
return obj;

if( typeof obj === "symbol" )
throw new TypeError();

//we know we have an object. perhaps return JSON.stringify?
return (obj).toString();
};

module.exports = defaultCompare;

如何测试?

您可以像下面这样测试这个函数:

const arr = [ undefined, null, 3, 2, 'B', 'a', 'b', 'A',
{ hello: "world"}, { goodnight: 'moon'} ]

assertEql( arr.sort(), arr.sort(defaultCompare) ); //true

只要您在同一浏览器中测试它们,输出应该是相等的。

关于javascript - Array.prototype.sort 默认比较函数如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334234/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com