在Javascript中使用Math.min.apply()获取数组的最小值会返回NaN?

时间:2014-06-13 22:56:51

标签: javascript arrays merge

var array1 = [4,2];
var array2 = [1,3];

var concatArray = array1.concat(array2);

// iteration 1
concatArray_min = Math.min.apply(Math,concatArray);
var result = [concatArray_min];
var index = concatArray.indexOf(concatArray_min);
delete concatArray[index];
console.log(concatArray);    // returns [4,2,3]
console.log(result);         // returns [1]

// iteration 2
concatArray_min = Math.min.apply(Math,concatArray);
console.log(concatArray_min);   // returns NaN
result.push(concatArray_min);
index = concatArray.indexOf(concatArray_min);
delete concatArray[index];
console.log(concatArray);    // returns [4,2,3]
console.log(result);         // returns [1,NaN]

我正在尝试合并两个数组,然后对它们进行排序。我首先连接数组,然后从未排序的连接数组中删除最小值,并将最小值推入结果数组。这首先起作用,但是第二次迭代失败,因为concatArray_min显示为NaN。问题可能是使用Math.min.apply.(Math,concatArray)获取最小值并使用delete删除元素?是否有替代方法而不使用.sort()

1 个答案:

答案 0 :(得分:1)

你问:

  

我正在尝试合并两个数组,然后对它们进行排序。如果不使用.sort()?

,是否有替代方法

首先,我将其构建在一个可重用的函数中。

其次让你的代码决定它何时完成迭代。

=> jsfiddle

var array1 = [4,2], array2 = [1,3];
console.log( 'Result:', mergeSortUp(array1,array2) );

function mergeSortUp(a1, a2){
    var mergeRes = a1.concat(a2), sortRes = mergeRes, completed = false;
    while(!completed){
        var didTakeAction = false;
        for(var i in mergeRes)
            if(sortRes[i-1] && mergeRes[i] < sortRes[i-1]){
                var temp = sortRes[i-1]; sortRes[i-1] = mergeRes[i];sortRes[i]= temp;
                didTakeAction = true;
            }
        if(!didTakeAction) completed = true;
    }
    return sortRes;
}