如果可能,如何使用.map方法对数组中的项目排序

时间:2019-02-07 12:04:05

标签: javascript

挑战的问题是:

修改该函数以返回给定数组的副本,该副本以升序(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;
}

4 个答案:

答案 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就足够了。