我试图递归这些数组以查找奇/偶数,然后将它们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
,
谁能帮助我解释为什么会导致字符串而不是我想要的数组
答案 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))
您可以将数组长度减少到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)