2015-08-03 4 views
0

это исходные данные. Я хочу использовать «привет» в источнике, найти «вверх», наконец-то, чтобы получить массив «[Макс, мин]» (например, многократного дерево, найти корни)Как я могу использовать функцию рекурсии для обработки массива?

var obj = { 
    'hello': { 

     "up": "world", 
     "down": "ccc" 
    }, 
    'world': { 

     "up": ["max","min"], 
     "down": "hello" 
    }, 
    'max': { 

     "up": null, 
     "down": "world" 
    }, 
    'min': { 

     "up": null, 
     "down": "world" 
    }, 
    'ccc': { 

     "up": "hello", 
     "down": null 
    } 

} 

Я использую рекурсию но код ниже не работает. Он возвращает «undefined». (если «вверх» не является массивом, функция работает.)

function findRoot(source,key){ 

    var up = source[key]['up']; 

    if(up==null){ 

     return key 

    }else{ 
     if(Object.prototype.toString.call(up)=='[object Array]'){ 

      up.forEach(function(d){ 

       return findRoot(source,d); 

      }) 

     }else{ 

      return findRoot(source,up) 
     } 

    } 
} 

Как я могу исправить этот код?

+1

Не могли бы вы добавить ожидаемый результат? – cjds

+0

Цель функции не ясна. – plalx

ответ

1

Вы ничего не возвращает в вашем «если массив» случай:

if(Object.prototype.toString.call(up)=='[object Array]'){ 
    up.forEach(function(d){ 
     return findRoot(source,d); 
    }) 
    // no return 

Если вы не зададите возврат, JavaScript по умолчанию будет возвращение undefined.

Также обратите внимание, что функция forEach ничего не сделает со значением, которое вы возвращаете из функции. Одним из вариантов было бы использовать функцию map вместо, а затем вернуть этот массив снова:

var results = up.map(function(d) { 
    return findRoot(source, d); 
}); 
return array; 

Однако, это также не может делать то, что вы намерены делать. Поскольку единственный базовый код, который имеет ваш код, - это когда значение равно null, ваша функция когда-либо только вернет null или массивы, содержащие нуль, а не что-то значимое. Например, вызов findRoot(obj, 'hello'); вернет [null, null], что, вероятно, не то, что вы хотите.

Если это так, вам может потребоваться переосмыслить, что именно должна означать ваша рекурсивная функция + посмотреть на добавление большего количества базовых случаев или изменение существующих базисных и рекурсивных случаев.

0

Проблема заключается в том, что вы возвращаетесь внутри своей анонимной функции в ваш цикл forEach(), который на самом деле ничего не возвращает для findRoot(), поэтому по умолчанию он возвращает undefined.

up.forEach(function(d){ 
    return findRoot(source,d);//doesn't return for **findRoot()** just for anonymous function. 
}); 

Что вы можете сделать, это вернуть массив корневых узлов, если их больше одного. Вы можете нажать на возврат на array, а затем вернуть массив. Если есть не более одного, вы можете просто вернуться, как обычно. Вот пример:

function findRoot(source,key){ 
    var up = source[key]['up']; 

    if(up==null){ 

     return key 

    }else{ 
     if(Object.prototype.toString.call(up)=='[object Array]'){ 
      var temp = new Array(); 
      up.forEach(function(d){ 
       temp.push(findRoot(source,d)); 
      }); 
      return temp; 
     }else{ 

      return findRoot(source,up) 
     } 

    } 
} 

Если у вас есть массив будет возвращаться, как это:

enter image description here

Если вы не массив будет возвращаться, как это:

enter image description here

Затем вы можете проверить, является ли возврат массивом или нет, и делать то, что вам нужно сделать с возвратом. Другой вариант - всегда возвращать массив, и если есть только один элемент, то в массиве будет только один элемент.

Смежные вопросы