前言:锻炼自己的思想,规范自己的编程思路。
问题:
给定一个数组 arr 和一个函数 fn,返回一个排序后的数组 sortedArr。你可以假设 fn 只返回数字,并且这些数字决定了 sortedArr 的排序顺序。sortedArr 必须按照 fn 的输出值 升序 排序。
你可以假设对于给定的数组,fn 不会返回重复的数字。
示例:(放代码里面)
输入:arr = [5, 4, 1, 2, 3], fn = (x) => x
输出:[1, 2, 3, 4, 5]
解释:fn 只是返回传入的数字,因此数组按升序排序。
思路:
这个题使用javascript的sort函数对数组中的元素进行排序。它接受一个可选的比较函数作为参数,用于确定数组中两个元素的顺序。如果没有提供比较函数,那么sort方法会按照字符编码的顺序对元素进行排序。
在这个问题中,我们需要根据 fn函数的返回值来确定两个元素的顺序。因此,我们可以定义一个比较函数,它接受两个参数a 和b,并返回fn(a) - fn(b) 的值。这样,当fn(a) 小于fn(b) 时,a 会排在b 前面;当fn(a) 等于 fn(b) 时,a 和 b 的顺序不变;当 fn(a) 大于 fn(b) 时,b 会排在a 前面。
我们使用 slice 方法来创建一个数组的副本,然后再对副本进行排序。这样,原始数组就不会被修改。
基于上述思考,代码如下:
/**
* @param {Array} arr
* @param {Function} fn
* @return {Array}
*/
var sortBy = function sortArray(arr, fn) {
return arr.slice().sort((a, b) => fn(a) - fn(b));
}
执行结果如下图: 击败100%的用户,撸啦啦噜啦啦噜啦噜啦啦
学到知识点:
(1)使用 sort 方法来对数组进行排序。sort 方法接受一个比较函数作为参数,用于确定数组中两个元素的顺序。
(2)使用slice 方法来创建一个数组的副本,然后再对副本进行排序。这样,原始数组不会被修改。