2017-04-19 3 views
1

次の単純なJavaScriptコード(マージソート)を使用しています。 (jsfiddleの26行目と31行目)。それは配列の範囲については何か?しかし、マージ関数の中で明確に定義されています。私はここで非常に概念的なものを紛失しています。どんな助けでも大歓迎です。配列オブジェクトが明確に定義されているにもかかわらず、配列オブジェクトが明示的に定義されていても有効ではありません。

https://jsfiddle.net/kalyanc/pu8988qc/

var A = [5,2,4,7,1,3,2,6];  

mergeSort(A); 

function mergeSort(array) { 
    if (array.length < 2) { 
    return array; 
    } 
    var midpoint = parseInt(array.length/2); 
    var left = array.slice(0, midpoint); 
    var right = array.slice(midpoint, array.length); 
    alert("Calling merge with arrays, " + left + " and " + right); 
    return merge(mergeSort(left), mergeSort(right)); 
} 

function merge(L, R) { 
    var Output = []; // Output array is clearly defined here. 

    var m = 0; 
    var n = 0; 

    while(m < L.length && n < R.length) 
    { 
    for (var x = 0; x < Math.min(L.length, R.length); x++) { 
     if (L[m] <= R[n]) { 
     Output.push(L[m]); // Does not work! 
     m++;   
     alert("Output from merge is array " + toString(Output)); 
     // Alerts: Output from merge is array [object Undefined] 
     } else { 
     Output.push(R[n]); // Does not work! 
     n++; 
     alert("Output from merge is array " + toString(Output)); 
     // Alerts: Output from merge is array [object Undefined] 
     }    
    } 
    }   

    // Check if either L or R have an element left 
    if (m < L.length) { 
    for (var o = m; o < L.length; o++) {      
     Output.push(L[o]); 
    }    
    } 
    if (n < R.length) { 
    for (var o = n; o < R.length; o++) { 
     Output.push(R[o]); 
    }    
    } 
    return Output;      
} 

答えて

2

toStringオブジェクトプロトタイプ関数であり、オブジェクトに対して呼び出されるべきです。

toString(Output)を呼び出す代わりに、Output.toString()を試してみてください。

jsfiddle

関連する問題