挑战的问题是:
修改该函数以返回给定数组的副本,该副本以升序(1、2、3等)排序。不要修改原始数组。
我试图做一个普通的for循环和一个if语句:
let original = [1, 7, 3, 5];
let sortedCopy = []
for (i = 0; i < original.length; i++){
if (original[i] > original[i+1]){
sortedCopy.push.([1])
}
}
console.log(sortedCopy);
现在我正尝试使用.map方法,因为它会自动循环并通过回调传递每个数字
function copyAndSortNumbers(numbers) {
this.numArray = numbers;
numArray.map(sortingArray)
function sortingArray (numbers){
if (numbers[i] > numbers[i+1]){
return numbers;
}
}
}
const original = [1, 7, 3, 5];
const sortedCopy = copyAndSortNumbers(original);
我应该得到一个新的有序数组,但是我看不到我缺少的东西
编辑:
这是一个更新的版本,它现在正在返回一个数组,但仍未对其进行排序
function copyAndSortNumbers(numbers) {
numArray = numbers;
numArray.map(sortingArray)
function sortingArray (numbers){
if (numbers > numbers + 1){
return numbers;
}
}
return numArray;
}
答案 0 :(得分:7)
您可以使用slice
复制数组,然后使用sort
对新数组进行排序。
const original = [1, 7, 3, 5];
const sorted = original.slice().sort((a, b) => a - b)
console.log(original, sorted)
array copy method速度的比较。
答案 1 :(得分:2)
要获得排序后的数组,您需要两个嵌套循环,一个用于给定数组,另一个用于查找插入实际元素的位置。
var array = [1, 7, 3, 5],
copy = array.slice(0, 1),
i, j;
outer: for (i = 1; i < array.length; i++) {
for (j = 0; j < copy.length; j++) {
if (array[i] < copy[j]) {
copy.splice(j, 0, array[i]);
continue outer;
}
}
copy.push(array[i]);
}
console.log(copy);
答案 2 :(得分:1)
使用传播语法可能会更简单,并返回一个新数组。
const initial = [1, 7, 3, 5];
const sorted = [...initial].sort((a, b) => a - b)
console.log(initial, sorted)
答案 3 :(得分:0)
很多。首先,
numArray.map(sortingArray)
应该引发错误,因为未定义numArray
。您有this.numArray
,这不是一回事。如果这不是问题,则该行不执行任何操作,因为您不会将结果分配给任何对象。但这还是行不通的,因为i
在您的回调中未定义...并且该回调不进行任何排序。
要创建数组的副本,可以使用let copy = numbers.slice()
,let copy = Array.from(numbers)
,let copy = [...numbers]
或实际上是let copy = numbers.map(x => x)
; 这最后一个是最慢的编辑:显然,Array.from
当前最慢,而Firefox的解构速度也很慢,而Firefox的执行速度实际上与map
一样快。去搞清楚。甚至提醒退伍军人,未经测试就永远不要表现。
然后要对该副本进行排序,slice
就足够了。