2017-09-20 15 views
2

JSONファイルをループして値を取得し、新しい配列にプッシュする関数があります。次のようにノードJS未定義変数

は、私は、関数の外の配列を宣言している次のように

var output = []; 

function get_json(jsonObj) { 
    console.log("Out put => " + output); 

    for (var x in jsonObj) { 
     if (typeof (jsonObj[x]) == 'object') { 
      get_json(jsonObj[x]); 
     } else { 
      output.push({ 
       key: x, 
       value: jsonObj[x] 
      }); 
      //console.log(output); 
     } 
    } 
    return output; 
} 

上記の関数が呼び出され、JSONデータに渡されます。配列を返すことになっている

var result = get_json(jsonObj); 

値、キー、および値で構成されます。しかし、関数にデータをプッシュすると、出力変数が定義されていないので配列を作成できないため、失敗につながります。 どのように配列を宣言できますか?それを宣言するのに最適なポジションは何ですか?

+0

私のために正常に動作するようです。おそらくもっとコードがあれば、コード全体を表示することができます。また、関数の外部に配列を宣言すると、グローバルになるので、関数が呼び出されるたびに、新しい項目は既存の配列にプッシュされます。 – David

+0

出力配列に何か不具合があります。 –

+1

@Davidオブジェクトのプロパティを渡すときにのみ問題が発生します.OPはネストした 'get_json'呼び出しの結果を処理していないようです。 – James

答えて

4

あなたは再帰関数を実行しようとしています。関数内でoutput宣言を移動して最後に返すことができますが、すべての繰り返し(つまり、ここではconcatpushを使用して)にそれを設定することを忘れないでください。私はそれがより洗練され、あなたが持っているように見えるような衝突を回避するので、このバージョンはグローバル変数よりも好きです。

function get_json(jsonObj) { 
 
    var output = []; 
 

 
    for (var x in jsonObj) { 
 
    if (typeof(jsonObj[x]) === 'object') { 
 
     output = output.concat(get_json(jsonObj[x])); 
 
    } else { 
 
     output.push({ 
 
     key: x, 
 
     value: jsonObj[x] 
 
     }); 
 
    } 
 
    } 
 

 
    return output; 
 
} 
 

 
console.log(get_json({ 
 
    person: { 
 
    name: 'John Doe', 
 
    age: 26, 
 
    stuff: [{ 
 
     name: 'Big Sword' 
 
     }, 
 
     { 
 
     name: 'Yoyo' 
 
     } 
 
    ] 
 
    }, 
 
    city: 'New York' 
 
}));