js函数中的toString返回undefined和0值

时间:2016-08-26 12:02:19

标签: javascript undefined tostring

我有为 Codewars 测试编写的函数:

  

你的任务是创建一个可以取任何非负整数的函数   作为参数并以降序返回它的数字。   降序意味着你取最高位并放置   紧随其后的下一个最高位数。

这是我的功能:

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:无法在Object.exports.runInThisContext上的descendingOrder中读取未定义的属性'length'

我知道未定义的值来自于将 n.toString 的结果赋给变量。

我尝试了以下内容:

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

但无济于事。

第二个问题: 通过我的函数输出的输出值为0

在发布此问题之前,我做了某些MDN和其他问题。我对 Codewars 挑战的逻辑的任何评论或批评都非常受欢迎。在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

不是问题的答案,但我认为它可能会短得多。您说非负整数但在代码中使用1.45312798,所以我使用了您的示例值。只需要一个整数(它会短得多)就不会花费太多时间。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这样的东西?

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 2 :(得分: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

答案 3 :(得分: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;
}

除了你的问题,还不清楚你想要的是什么。