2017-08-15 10 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()'だけが戻ります。 'listToArray()'の中から何かを取り出したい場合は、 'return();'を返す必要があります – fen1x

答えて

0

ちょうどreturn newArray - そのような割り当てを返すことはできません。

+0

どうしてですか? –

0

あなたは外側の関数ではなく、内側の関数から戻ることになります。の下部にreturn newArrayを追加します。 の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* forList(list) { 
    while (list) { 
    yield list.value; 
    list = list.rest; 
    } 
} 

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; 
} 

として書くことができます私はちょうど書くことができるので、値の配列を作成するために別の関数が必要です

[...forList(list)] 
+0

ありがとうございました!できます! –

関連する問題