2016-07-16 2 views
1

JavaScriptで配列からリストを作成しようとしています。もともとドット表記を使って各変数の新しい値を定義していました。しかし、これは、配列内の最初の値の無限リストのように見えるものを生成します。JavaScript配列からリストを作る

{value: 10, rest: {value: 10, rest:{etc...}}}

ヒントとして与えられたコードは、以下の機能にコメントアウトものです。これを実行すると、正しい出力が得られます(ただし、まだコード化されていない最後の残りの値にはnullが割り当てられます)。

function arrayToList(array) { 
    var object = {}; 
    for (var i = array.length - 1; i >= 0; i--) { 
    object.rest = object; 
    object.value = array[i]; 
    //object = {value: array[i], rest: object}; 
    } 
    return object; 
} 

console.log(arrayToList([10, 20])); 
// → {value: 10, rest: {value: 20, rest: null}} 

2つの異なる方法の違いは何ですか?

+0

_ "二つの異なる方法を使用しての違いは何ですか?" _どの二つの方法? –

答えて

3

object.restに割り当てるために同じオブジェクトを使用するため、objectで循環参照を作成しています。

function arrayToList(array) { 
 
    var object = {}; 
 
    for (var i = array.length - 1; i >= 0; i--) { 
 
     object.rest = object; 
 
     object.value = array[i]; 
 
     //object = {value: array[i], rest: object}; 
 
    } 
 
    return object; 
 
} 
 

 
console.log(arrayToList([10, 20])); 
 
// → {value: 10, rest: {value: 20, rest: null}}

他の例では、割り当てにobject上書き。

function arrayToList(array) { 
 
    var object = {}; 
 
    for (var i = array.length - 1; i >= 0; i--) { 
 
     //object.rest = object; 
 
     //object.value = array[i]; 
 
     object = {value: array[i], rest: object}; 
 
    } 
 
    return object; 
 
} 
 

 
console.log(arrayToList([10, 20])); 
 
// → {value: 10, rest: {value: 20, rest: null}}

あなたは残りのオブジェクトを返すためArray#reduceと短いES6のバージョンを使用することができます。

function toList(arr) { 
 
    var result = {}; 
 
    arr.reduce((o, a) => (o.value = a, o.rest = {}), result); 
 
    return result; 
 
} 
 

 
console.log(toList([2, 3, 5, 7, 11]));

+0

冗長な結果変数を削除します。 –

+0

@mortezaT、なぜですか?それなしでは動作しません。 –

+0

必要なものは次のとおりです: 'arr.reduce(....、{})' –

1

私はこれがあなたのリンクリストのための別の実装であると思います。 reduceRightreduceに置き換えるだけで、リンクの方向を変更できます。

function toList(arr) { 
 
    return arr.reduceRight(function(rest, value) { 
 
    return { value: value, rest: rest }; 
 
    }, null); 
 
} 
 

 
console.log(toList([1, 3]));

+0

あなたは 'null'で始めることができます。 –

+1

@NinaScholzはい、それは削減の楽しさです。 –

関連する問題