2016-08-26 46 views
1

我已經功能我有一個Codewars測試寫:的toString js函數內部返回undefined和0值

Your task is to make a function that can take any non-negative integer as a argument and return it with it's digits in descending order. Descending order means that you take the highest digit and place the next highest digit immediately after it.

這裏是我的功能:

function descendingOrder(n) { 
    // convert number into string 
    var toStr = n.toString(); 
    console.log("converted to string:"); 
    console.log(n); 

    // split string at "decimal" point 
    strArray = toStr.split("."); 
    console.log("split string"); 
    console.log(strArray); 

    // create new array from decimal numbers 
    strArray.splice(0,1); 
    console.log("Array after split: " + strArray); 

    // split into array 
    for (var i=0; i<strArray.length; i++) { 
    var splitStrArray = strArray[i].split(""); 
    } 

    console.log("new split str Array:"); 
    console.log(splitStrArray); 

    // loop array and: 1) convert to number 2) push to new array of numbers 
    var numArray = []; 
    for (var j=0; j<splitStrArray.length; j++) { 
    numArray.push(Number(splitStrArray[j])); 
    } 

    // sort in descending order 
    numArray.sort(function(a,b){return b-a}); 
    console.log("new array of numbers:"); 
    console.log(numArray); 
} 

descendingOrder(1.45312798); 

第一個問題: 尋找未定義的結果我收到以下錯誤:

TypeError: Cannot read property 'length' of undefined at descendingOrder at Object.exports.runInThisContext

我知道未定義的價值來自分配的結果n.toString給一個變量。

我試過如下:

var toStr = ''; 
toStr = n.toString(); 

,但無濟於事。


第二個問題: 有0它正在通過我的函數把

我沒有張貼此人之前一定MDN問題和其他問題的出放值。任何評論或批評我的邏輯關於Codewars挑戰是非常值得歡迎的。先謝謝您的幫助。

+0

我沒有收到該錯誤。 – Xufox

+1

將'n'轉換爲字符串檢查之前如果值爲空或空。如果它是UNDEFINED/NULL,它會拋出一個錯誤。 –

+0

當輸入到控制檯時,它們都不是來自Codewars輸出。我應該指定道歉。但它仍然會在控制檯中爲我返回一個未定義的值。 –

回答

1

這個函數的所有:

function result(n) { 
    var digs=[]; 
    if (n.toString().indexOf('.')>-1) { 
     var m=n.toString().slice(0,n.toString().indexOf('.')); 
    } else { 
     var m=n.toString(); 
    } 
    for (var i=0;i<m.length;i++) { 
     digs.push(parseInt(m[i])); 
    } 
    return parseInt(digs.sort().reverse().join('')); 
} 
console.log(result(16435.43)) // 65431 
console.log(result(16433153)) // 65433311 
+1

的碼大一點,但它需要採取十進制值:/ –

+0

你說「非負整數」是個問題? –

+0

我也許沒有,我沒有正確理解這個問題。 *上投票*你的答案 –

1

這樣的事情?

function descendingOrder(n) { 
 
    console.log(n); 
 

 
    // convert number into string 
 
    var toStr = n.toString(); 
 

 
    // split string into array 
 
    strArray = toStr.split(""); 
 

 
    var t = strArray.indexOf('.') + 1; 
 

 
    // get decimal digits 
 
    var newStr = strArray.splice(t); 
 

 
    // arrange values by descending order 
 
    newStr = newStr.sort().reverse(); 
 

 
    var sortedNo = strArray.splice(0, t).concat(newStr).join(''); 
 

 
    // print the sorted value 
 
    console.log(sortedNo); 
 
} 
 

 
descendingOrder(1.45312798);

+0

偉大的解決方案@Pugazh非常優雅和整潔! –

+1

使用'slice',而不是'splice',或者至少,如果你使用的第一個'splice'你不需要第二個。如果你改變這個:var t = strArray.indexOf('。')+ 1 || strArray.length;'它保持與整數一致 – Thomas

2

不是一個問題的答案,但我認爲這可能是短了很多。你說非負整數但在你的代碼中使用1.45312798,所以我用你的示例值。不需要太多的工作,只需要一個整數(將會縮短很多)。

var n = 1.45312798; 
 

 
function sortNumb(n) { 
 
    var p = n.toString().split("."); 
 
    var s = (p[1]) ? "."+ p[1].split("").sort().reverse().join("") : ""; 
 
    console.log(p[0]+s); 
 
} 
 
sortNumb(n);

+0

很棒的代碼@Tigger!真正令人驚訝的是,如何在寫作高效的JavaScript時創造性地思考!更多學習! –

0

兩款微型版本的一些ES6

//a utility 
var sortNumericDecending = (a,b) => b-a; 

//simple version that works with positive ints 
function descendingOrder(n){ 
    return +String(n).split("").sort(sortNumericDecending).join(""); 
} 

//takes floats and orders the decimal places 
function descendingOrder(n){ 
    var [int, decimals] = String(+n).split("."); 
    return decimals? 
     +(int + "." + decimals.split("").sort(sortNumericDecending).join("")): 
     n; 
} 

//or the same without Array destructuring 
function descendingOrder(n){ 
    var parts = String(+n).split("."); 
    return parts.length > 1? 
     +(parts[0] + "." + parts[1].split("").sort(sortNumericDecending).join("")): 
     n; 
} 

除了你的問題,它不再清楚至極你想要一個。