在数组中递归以找到奇数并推送到新变量

时间:2019-01-08 10:07:04

标签: javascript arrays loops if-statement recursion

我试图递归这些数组以查找奇/偶数,然后将它们push移至newArr,但结果不是数组,结果是带有数字的字符串,该字符串是找到奇/偶数之后的结果。 / p>

这是我写的代码,

function odd(nums){
  var result = [];
  if(nums.length === 0) {
    return result;
  } else  if (nums[0] % 2 === 0){
    result.push(nums[0])
    // return odd(nums.slice(1))
  };
  return result + odd(nums.slice(1));
};

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var print = odd(arr);
console.log(print)
如果我不写return result + odd(nums.slice(1));,结果什么都不做/ undefined

谁能帮助我解释为什么会导致字符串而不是我想要的数组

5 个答案:

答案 0 :(得分:5)

您需要concat个数组。 +仅适用于字符串或数字。

顺便说一句,在语句{ ... }之后,您不需要分号。

function odd(nums){
    var result = [];
    if (nums.length === 0) {
        return result;
    } 
    if (nums[0] % 2 === 0) {
        result.push(nums[0]);
    }
    return result.concat(odd(nums.slice(1)));
}

var arr = [1, 8, 3, 4, 4, 5, 9, 13, 13, 9, 10];
var print = odd(arr);
console.log(print);

答案 1 :(得分:4)

在JS中,递归可能不是一个好主意,除非没有更好的方法来解决问题,否则应使用递归。如果执行过多的递归函数调用,则速度会较慢,并可能导致溢出。

要获得所需的结果,最好使用数组filter方法。它更清晰,更快。

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var odd = arr.filter(n => !(n % 2))
console.log(odd)

对于最初的问题,我会这样做:

function odd(nums, result = []){
  if (!nums.length) return result; // no need for else, this way clearer
  if (nums[0] % 2 === 0) result.push(nums[0])
  return odd(nums.slice(1), result)
};

var arr = [1,8,3,4,4,5,9,13,13,9,10];
console.log(odd(arr))


!!!注意,下一个代码片段将导致StackOverflow !!!

您可以将数组长度减少到10000以检查它是否可以正常工作。

function odd(nums, result = []){
  if (!nums.length) return result; // no need for else, this way clearer
  if (nums[0] % 2 === 0) result.push(nums[0])
  return odd(nums.slice(1), result)
};

const arr = Array.from({length: 100000}, (_,i) => i)
const result = odd(arr)
console.log(`Array length: ${arr.length}`)
console.log(`Result length: ${result.length}`)
console.log(result.slice(0,5))

答案 2 :(得分:2)

您可以使用concat方法。

function odd(nums){
  var result = [];
  if(nums.length === 0) {
    return result;
  } else  if (nums[0] % 2 === 0){
    result.push(nums[0])
    // return odd(nums.slice(1))
  }
  return result.concat(odd(nums.slice(1)));
}

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var print = odd(arr);
console.log(print)

答案 3 :(得分:1)

您现在需要使用concat代替字符串连接,而不是filter

var odd = [], 
   even = [1,8,3,4,4,5,9,13,13,9,10]
  .filter(function(x) { if (x % 2 === 0) return true; else odd.push(x) } );
console.log(odd,even)

答案 4 :(得分:1)

另一种方法是将包含结果的数组作为参数传递,因为它将作为引用,所以您不必返回任何内容。

function odd(nums, result)
{
    if(nums.length != 0)
    {
        if (nums[0] % 2 === 0)
        {
            result.push(nums[0]);
        }
        odd(nums.slice(1), result);
    }
}

var arr = [1,8,3,4,4,5,9,13,13,9,10];
var result = [];
odd(arr, result);
console.log(result)