简单的javascript递归函数返回的值多于实际存在的值?

时间:2015-10-20 14:36:13

标签: javascript function recursion

我正在练习递归并编写了这个函数:

var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]];
var results = [];

function bagger293(bigArray){
  for (var item in bigArray){
    if (Array.isArray(bigArray[item])){
      bagger293(bigArray[item]);
    }
     else if (typeof bigArray[item] === 'object'){
      bagger293(bigArray[item]);
    }else{
      results.push(bigArray[item]);
    }
  }
}

bagger293(bigArray);
console.log(results);

我只是希望函数将任何单个值推送到数组,并且如果它是对象或数组则更深入地搜索。奇怪的是,我的函数返回了这个:

[ 'a', 'b', 'c', 'd', 'e', 'd', 'e', 'c', 'd', 'e', 'd', 'e', 'b', 'c', 'd', 'e', 'd', 'e', 'c', 'd', 'e', 'd', 'e' ]

我认为这是因为我的指定方式

bigArray[item]但不知道原因究竟是什么。

预期结果:

['a', 'b', 'c', 'd', 'e']

3 个答案:

答案 0 :(得分:4)

你错过了else。一旦你发现了一个阵列,就不要再尝试用其他东西了。

var bigArray = ['a', ['b', ['c', ['d', { a: 'e' }]]]];
var results = [];

function bagger293(bigArray) {
  for (var item in bigArray) {
    if (Array.isArray(bigArray[item])) {
      bagger293(bigArray[item]);
    } 
    else if (typeof bigArray[item] === 'object') {   // <--
      bagger293(bigArray[item]);
    } 
    else {
      results.push(bigArray[item]);
    }
  }
}

bagger293(bigArray);
console.log(results);

另一方面,由于所有数组都是对象,因此您只需测试'object'

var bigArray = ['a', ['b', ['c', ['d', { a: 'e' }]]]];
var results = [];

function bagger293(bigArray) {
  for (var item in bigArray) {
    if (typeof bigArray[item] === 'object') {
      bagger293(bigArray[item]);
    } 
    else {
      results.push(bigArray[item]);
    }
  }
}

bagger293(bigArray);
console.log(results);

答案 1 :(得分:3)

你错过了其他人。由于数组也是一个对象,因此您的代码会开始两次递归。

这是有效的:

function bagger293(bigArray){
  for (var item in bigArray){
    if (Array.isArray(bigArray[item])){
      bagger293(bigArray[item]);
    }else if (typeof bigArray[item] === 'object'){
      bagger293(bigArray[item]);
    }else{
      results.push(bigArray[item]);
    }
  }
}

答案 2 :(得分:2)

所有数组都是对象。无需同时检查Array.isArraytypeof == 'object'

var bigArray = ['a', ['b', ['c', ['d', {a:'e'}]]]];
var results = [];
(function bagger293(bigArray) {
  for (var item in bigArray)
    if (typeof bigArray[item] === 'object')
      bagger293(bigArray[item]);
    else
      results.push(bigArray[item]);
})(bigArray);
console.log(results);