为什么程序返回undefined?

时间:2017-10-13 17:48:36

标签: javascript sorting return

写一个mySort函数,它接受一个整数数组,并且应该返回一个输入整数的数组,这些整数被排序,使得奇数首先出现,偶数出现最后。 所以: mySort([90,45,66,' bye',' 100.5']) 应该回来 [45,66,90,100]。

这是我的代码:



function mySort(array) {
  var strArray = [];
  var oddArray = [];
  var evenArray = [];
  var sortedArray = [];
  var arrayLength = array.length
  for (var i = 0; i <= arrayLength; i++) {
    if (array[i] === 'string') {
      strArray = array[i].push();
    }
    if (Math.floor().array[i] % 2 === 0) {
      evenArray = array[i].push();
    }
    if (Math.floor().array[i] % 2 !== 0) {
      oddArray = array[i].push();
    }
  }

  sortedArray = sort(oddArray) + sort(evenArray);
}

console.log(mySort[90, 45, 66, 'bye', 100.5]);
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

有几个错误。

  1. 你没有回来:

    function mySort(array) {
        // ...
        return sortedArray;
    }
    
  2. 您应该将参数传递给Math.floor:

    Math.floor(array[i]);
    
  3. 您应该将参数传递给array.push:

    strArray.push(array[i]);
    evenArray.push(array[i]);
    oddArray.push(array[i]);
    
  4. 你应该结束:

    sortedArray = oddArray.concat(evenArray);
    
  5. 现在它至少会运行。

    1. 您应该使用typeof :(排序字符串)

      if (typeof array[i] === 'string') {
          // ...
      }
      
    2. 你应该使用if :(删除字符串)

      if (typeof array[i] === 'string') {
          // ...
      }
      else if (Math.floor(array[i]) % 2 === 0) {
          // ...
      }
      else if (Math.floor(array[i]) % 2 !== 0) {
          // ...
      }
      
    3. 您的for循环应该更早结束:(删除undefined

      for (var i = 0; i < arrayLength; i++) {
          // ...
      }
      
    4. 你应该发言:

      evenArray.push(Math.floor(array[i]));
      oddArray.push(Math.floor(array[i]));
      
    5. 最后,按顺序排列using a comparator

      sortedArray.sort(function (a, b) { return a - b; })
      
    6. 解决方案:

      function mySort(array) {
          var strArray = [];
          var oddArray = [];
          var evenArray = [];
          var sortedArray = [];
          var arrayLength = array.length;
          for (var i = 0; i < arrayLength; i++) {
              if (typeof array[i] === 'string') {
                  strArray.push(array[i]);
              }
              else if (Math.floor(array[i]) % 2 === 0) {
                  evenArray.push(Math.floor(array[i]));
              }
              else if (Math.floor(array[i]) % 2 !== 0) {
                  oddArray.push(Math.floor(array[i]));
              }
          }
      
          sortedArray = oddArray.concat(evenArray);
          sortedArray.sort(function (a, b) { return a - b; });
          return sortedArray;
      }
      
      console.log(mySort([90, 45, 66, 'bye', 100.5])); // [45, 66, 90, 100]
      

答案 1 :(得分:2)

  • 您没有return声明。 JavaScript function语法不会隐式返回最后一个表达式,除非在没有显式返回的情况下返回undefined

  • 您应该.concat()数组。 +并没有做你想要的事情。

    return sort(oddArray).concat(sort(evenArray));
    
  • 这种情况不正确:

    if(array[i] === 'string'){
    
  • 您需要typeof来检查会员的类型。

    if(typeof array[i] === 'string'){
    
  • 您的.push()来电是错误的。我想你的意思是:

    evenArray.push(array[i]);
    
  • 您的递归调用应该使用mySort()而不是sort()

  • strArraysortedArray基本上被忽略了。

  • Math.floor()期待一个论点。

     Math.floor(array[i])
    
  • 您的循环条件错误。它应该是i < arrayLength,而不是<=

  • 您的递归没有转义条款

  • 您对mySort的初始调用未使用括号来调用它。它应该是:

    console.log(mySort([/*...array items...*/]));
    
  • 您的if条件应使用else。如果它是一个字符串,你不需要再次测试它,假设它被排除在外。如果它不均匀,那么根据您的标准,您知道它很奇怪,因此不需要最后一个条件。

  • 您显然希望尽可能将字符串转换为数字,并转换为整数。因此,您可以继续使用typeofparseInt+转换它,而不是Number检查,并检查它是否NaN ,如果是这样,将其传递,如果没有,请确保在将其测试为奇数/偶数之前将其转换为整数。

请注意,当函数体由单个表达式组成时,arrow functions会有隐式返回。

这是一个有上述更正的工作示例:

&#13;
&#13;
function mySort(array) {
    var oddArray = [];
    var evenArray = [];
    var arrayLength = array.length;
    for(var i = 0; i < arrayLength; i++) {
        var n = Math.floor(Number(array[i]));
        if (isNaN(n)) {
            continue;
        }
        
        if (n % 2 === 0 ){
            evenArray.push(n);
        } else {
            oddArray.push(n);
        }
    }

    return oddArray.length < 1 ? evenArray :
           evenArray.length < 1 ? oddArray : 
           mySort(oddArray).concat(mySort(evenArray));
}


console.log(mySort([90, 45, 66, 'bye', 100.5]));
&#13;
&#13;
&#13;

答案 2 :(得分:0)

通过对@llama的代码进行简单的改进,可以返回预期的结果。

我们只需要对oddArray和evenArray分别进行排序。

function mySort(nums) {
  'use strict'
    var array = nums
    var strArray = [];
    var oddArray = [];
    var evenArray = [];
    var sortedArray = [];
    var arrayLength = array.length;
    for (var i = 0; i < arrayLength; i++) {
        if (typeof array[i] === 'string') {
            strArray.push(array[i]);
        }
        else if (Math.floor(array[i]) % 2 === 0) {
            evenArray.push(Math.floor(array[i]));
        }
        else if (Math.floor(array[i]) % 2 !== 0) {
            oddArray.push(Math.floor(array[i]));
        }
    }
// sort oddArray
    oddArray.sort(function (a, b) { return a - b; });
// sort evenArray
    evenArray.sort(function (a, b) { return a - b; });
// make an array from both of them.
    sortedArray = oddArray.concat(evenArray);
    return sortedArray;
}