返回排序数组而不修改原始数组

时间:2015-10-20 20:52:13

标签: javascript arrays

我遇到一个函数返回原始数组而不是排序数组。我试图切片数组并返回已排序,但它不起作用。关于如何解决这个问题的任何想法?

function sortArr( comparator, array ){

var newArray = array.slice();

for(var i = 0; i < newArray.size; i++)
{
    var min = i;
    for(var x = i; x < newArray.size; x++)
    {
        if(comparator(newArray[min],newArray[x]) == true)
        {
            min = x;
        }
    }

    var temp = newArray[i];
    newArray[i] = newArray[min];
    newArray[min] = temp;

}

return newArray;

}

我修复了这个功能:

function sortArr( comparator, array ){
    /*your code here*/
    var i, x;
    var min;
    var newArray = array.slice();

    for(i = 0; i < newArray.length - 1; i++)
    {
        min = i;
        for(x = i + 1; x < newArray.length; x++)
        {
            if(comparator(newArray[min],newArray[x]) == true)
            {
                min = x;
            }
        }

        if(min != i){
            var temp = newArray[i];
            newArray[i] = newArray[min];
            newArray[min] = temp;
        }

    }

return newArray;

}

3 个答案:

答案 0 :(得分:6)

使用slice复制数组,然后使用原生sort

function sortArr(comparator, array) {
  return array.slice().sort(function(a,b) {
    return comparator(a,b) * 2 - 1;
  });
}

答案 1 :(得分:0)

您的排序算法看起来并不合适。首先,值的交换应该在if语句中。我还建议你看看@Oriol的解决方案,它更加优雅。

function sortArr( comparator, array ){

var newArray = array.slice();

for(var i = 0; i < newArray.size; i++)
{
    var min = i;
    for(var x = i; x < newArray.size; x++)
    {
        if(comparator(newArray[min],newArray[x]) == true)
        {                   
            var temp = newArray[i];
            newArray[i] = newArray[min];
            newArray[min] = temp;
            min = x;
        }
    }
}

return newArray;

}

答案 2 :(得分:-3)

{"index.js":"var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
  let newArr = globalArray.slice();\n  let  emptyArr = [];
  return emptyArr.concat(newArr).sort();
}
nonMutatingSort(globalArray);"}