您的位置  > 互联网

如何在毫无麻烦和困扰的对数组对象进行排序?

要阅读本文,您需要了解声明变量、定义函数和条件语句等基本概念。 我还将使用 ES6 语法。 更多 ES6 可以在这里查看。

数组的基本排序

默认情况下,Array.sort 对数组中的每个元素进行排序,将其转换为字符串,并比较它们在表中的顺序。

const foo = [9, 2, 3, '', '熊猫'];

foo.sort();

// [ 2, 3, 9, '熊猫', '' ]

const bar = [4, 19, 30, (){}, {key: 'value'}];

排序();

// [ 19, 30, 4, { key: '值' },[] ]

您可能想知道为什么 30 前面有 4。这没有逻辑。 其实这是因为数组中的每个元素先转换为字符串,然后再对对应的4和30进行排序。

还值得注意的是,与许多其他数组函数不同。 Array.sort 实际上改变了数组的排序。

const baz = ['你好世界', 31, 5, 9, 12];

baz.sort();

// baz 数组已被修改

.log(baz);

// [12, 31, 5, 9, “你好世界”]

为了避免这个问题,您可以创建一个新的数组实例来进行排序和修改。

const baz = ['你好世界', 31, 5, 9, 12];

// baz 数组的 new 是 and

const = baz.slice().sort();

.log(baz);

// “你好世界”, 31, 5, 9, 12]

。日志();

// [12, 31, 5, 9, “你好世界”]

简单地使用 Array.sort 对数组对象进行排序不太实用。 值得庆幸的是,该函数接受一个可选参数,该参数会导致数组元素根据函数返回值进行排序。

使用函数的比较函数

假设 a 和 b 是比较函数正在比较的两个元素。 如果返回值为:

1:b之前的a小于0

2:a之前的b大于0

3: 等于 0 a 等于 b

看一个简单的栗子:

常量 arr = [1,2,30,4];

(一,二){

让= 0;

如果(a>b){

= 1;

} 否则如果 (b > a) {

=-1;

;

arr.sort();

// => 1, 2, 4, 30

上述方法可以通过从 a 中减去 b 来重构

(一,二){

a - b;

修改为箭头函数:

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

对对象数组进行排序

现在让我们看一下对对象数组进行排序

常量带 = [

{ 流派:“说唱”,乐队:“Migos”,:2},

{ 流派:'流行',乐队:'',:4},

{ 流派:“摇滚”,乐队:“ ”,:1}

];

我们可以使用以下比较函数根据类型对数组对象进行排序

(一,二){

// 使用 () 来

const = a.genre.();

const = b.genre.();

让= 0;

如果(>){

= 1;

} 否则如果 ( < ) {

=-1;

;

band.sort();

/* [

{ 流派: '流行', 乐队: '', : 4 },

{ 流派:“说唱”,乐队:“Migos”,:2 },

{ 流派:“摇滚”,乐队:“ ”,:1 }

] */

要反转排序顺序,只需反转比较函数的返回值即可

(一,二){

...

// 值减-1

*-1;

创建动态排序功能

我们创建一个排序函数,可用于对值为字符串或数字的数组对象进行排序。 该函数有两个参数,分别是我们要排序的键和结果(升序或降序)。

常量带 = [

{ 流派:“说唱”,乐队:“Migos”,:2},

{ 流派:'流行',乐队:'',:4,:13},

{ 流派:“摇滚”,乐队:“ ”,:1}

];

// 为了

(键,顺序='asc'){

(一,二){

if(!a.(key) || !b.(key)) {

// 不存在于

0;

const varA = ( a[key] === '') ?

a[key].() : a[key];

const varB = ( b[key] === '') ?

b[key].() : b[key];

让= 0;

if (varA > varB) {

= 1;

} 否则 if (varA < varB) {

=-1;

(顺序=='描述')? (*-1):

);

};

使用方法如下:

// 数组是按band排列的,按顺序排列

band.sort(('band'));

// 数组按 band 按顺序排列

band.sort(('band', 'desc'));

//数组是按顺序排列的

band.sort((''));

在上面的代码中,该方法用于检查指定的属性是否在每个对象上都定义了并且不是通过原型链继承的。 如果未定义对象,则该函数返回 0,从而保持排序顺序。

也用于检查值的数据类型。 这允许函数确定对数组进行排序的正确方法。 例如,如果指定属性的值为字符串,则该方法可以将字符串转换为大写,并且可以不考虑大小写地进行字符串排序。

您可以调整上述函数以适应其他数据类型以及任何其他功能脚本需求。

综上所述

现在您已经了解了对对象数组进行排序的简要介绍。 尽管许多库提供了这种动态排序功能。 自己实现这个功能并不是很难。

没有公开

汽车服务前端团队