📅  最后修改于: 2023-12-03 15:39:09.893000             🧑  作者: Mango
在进行数组排序时,通常情况下我们希望把数组中的元素按照升序或者降序排列。但是,当数组中存在负数时,我们可能并不想改变负数的位置,只希望把正数按照升序或者降序排列。
本文将介绍如何对数组进行排序,同时保持负数的位置不变。我们将使用两种方法来实现这一目标:一种是使用自定义比较函数,另一种是使用过滤器和map。
在使用JavaScript的数组排序函数sort()
时,我们可以提供一个自定义的比较函数。该函数接受两个参数,表示待比较的两个元素。比较函数需要返回一个数字,如果返回值为负数,则表示第一个元素应该排在第二个元素前面;如果返回值为正数,则表示第一个元素应该排在第二个元素后面;如果返回值为0,则表示两个元素相等,它们的相对位置不变。
我们可以利用这个机制,编写一个自定义的比较函数,使其具有以下特点:
下面是一个使用自定义比较函数对数组进行排序的例子:
const arr = [3, -1, 7, 0, -5, 2];
arr.sort((a, b) => {
if (a < 0 && b >= 0) {
return -1;
} else if (a >= 0 && b < 0) {
return 1;
} else {
return a - b;
}
});
console.log(arr); // [-1, 0, 2, 3, -5, 7]
在这个例子中,我们首先定义了一个待排序的数组arr
。然后,我们使用sort()
函数对其进行排序,并传入一个自定义的比较函数。在这个比较函数中,我们首先判断两个元素是否分别是正数和负数,如果是,则按照规则返回负数或正数;否则,我们使用默认的大小比较规则进行排序。最后,我们输出排好序的新数组。
值得注意的是,我们在比较函数中使用了“三元表达式”。这是一种简洁的条件控制结构,其含义是:如果条件成立,则返回表达式1的值;否则,返回表达式2的值。
在JavaScript中,数组有两个非常实用的方法:filter()
和map()
。filter()
函数可以根据指定的条件,从原数组中筛选出符合条件的元素,并返回这些元素组成的新数组;map()
函数可以对原数组中的每个元素执行指定的操作,然后返回操作后的新数组。
使用这两个函数,我们可以实现一个对数组进行排序的操作,同时保持负数的位置不变。具体方法如下所示:
const arr = [3, -1, 7, 0, -5, 2];
const positiveArr = arr.filter((n) => n >= 0).sort((a, b) => a - b);
const negativeArr = arr.filter((n) => n < 0).sort((a, b) => b - a);
const resultArr = arr.map((n) => (n >= 0 ? positiveArr : negativeArr).shift());
console.log(resultArr); // [3, -1, 7, 0, -5, 2]
在这个例子中,我们首先定义了一个待排序的数组arr
。然后,我们使用filter()
函数筛选出所有的正数,并对它们进行升序排序。我们还使用filter()
函数筛选出所有的负数,并对它们进行降序排序。最后,我们使用map()
函数对原数组中的每个元素进行操作,如果元素是正数,则从排序后的正数数组中取出最小的元素作为操作结果;否则,从排序后的负数数组中取出最大的元素作为操作结果。最终,我们输出按照要求排好序后的新数组。
以上两种方法均可以实现对数组进行排序,而不改变负数的相对位置。具体使用哪一种方法,取决于不同的需求和场景。需要注意的是,在使用map()
函数时,我们调用了shift()
方法来取出数组的第一个元素。这个方法会改变原数组的内容,因此我们需要在定义新数组之前,对原数组进行一次复制操作。