2017-08-15 79 views
-2
function listToArray(list){ 
    var newArray = []; 
    repeat(); 
    function repeat(){ 
     newArray.push(list.value); 
     if(list.rest == null){ 
      return obj = newArray; // I don't know why It returns undefined here 
     } 
     else { 
     list = list.rest; 
     repeat(); 
     } 
    } 
} 

// and this will return an array 

function reTurn(){ 
    var listVar = [5, 4, 3, 2, 1]; 
    return obj = listVar; 
} 

当我在控制台中查找它时,该函数确实会改变我的obj,但返回undefined。 任何人都可以帮助我?请JavaScript将对象列表更改为数组。 return undefined

+0

函数'listToArray()'不返回任何东西 - 只有'repeat()'做。你必须'return repeat();'如果你想从'listToArray()'中获得一些东西' – fen1x

回答

0

只是return newArray - 你不能返回这样的任务。

+0

为什么你不能? – 2017-08-15 04:41:53

0

你从内部函数返回,而不是外部函数。将return newArray添加到listToArray的底部。将repeat中的return声明更改为return;

function listToArray(list){ 
    var newArray = []; 
    repeat(); 

    function repeat(){ 
     newArray.push(list.value); 
     if (list.rest) { 
      list = list.rest; 
      repeat(); 
     } 
    } 

    return newArray; 
} 

递归方法没有什么不对,但没有必要。你可以很容易地编写

function listToArray(list){ 
    var newArray = []; 

    while (list) { 
     newArray.push(list.value); 
     list = list.rest; 
    } 

    return newArray; 
} 

然而,即使这个代码的缺点是它是混合列表的遍历与值数组的建设。这将是更好地把这些分开:

function traverseList(list, fn) { 
    while (list) { 
    fn(list.value); 
    list = list.rest); 
    } 
} 

现在你可以写listToArray作为

function listToArray(list) { 
    var newArray = []; 

    traverseList(list, value => newArray.push(value)); 

    return newArray; 
} 

我也可能会这样写作为发电机:

function* forList(list) { 
    while (list) { 
    yield list.value; 
    list = list.rest; 
    } 
} 

现在,我甚至不需要一个单独的函数来创建数组值,因为我可以只写

[...forList(list)] 
+0

谢谢!有用! –