2016-11-04 18 views
0

最初のレベルに3つのネストされたオブジェクトを持つJSONオブジェクトがあります。Node.jsでネストされたJSONオブジェクトのすべてのキー値をparentに移動する方法

data{"key1":"value1", "key2":"value2", 
    "section1":"{"key1_1":"value1_1", "key1_2":"value1_2"}", 
    "section2":"{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}", 
    "section3":"{"key3_1":"value3_1"}" 
} 

さて、Node.jsのを使用して、私はこのように、ルートレベルですべてのキー値を親オブジェクトにネストされたからすべてのキーと値を移動する必要があります。適切なオブジェクトで

data{ 
"key1":"value1", "key2":"value2","key1_1":"value1_1", "key1_2":"value1_2", "key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3", "key3_1":"value3_1" 
} 
+1

あなたが投稿した何を、有効なJSONでもない、またはたとえ有効なJavascriptオブジェクトであっても... – Keith

+0

残念ながら、データはちょうどそのようなものです: "{"。これらはセクション内のJSON文字列です。 –

+0

どのようにシリアル化されたデータが含まれていますか? –

答えて

2

キーを反復することができます。オブジェクトが見つかった場合は、見つかったオブジェクトの内容で関数を再度呼び出します。値と値がJSONであればテストのためtry ... catch文とJSON文字列と

function flat(source, target) { 
 
    Object.keys(source).forEach(function (k) { 
 
     if (source[k]!== null && typeof source[k] === 'object') { 
 
      flat(source[k], target); 
 
      return; 
 
     } 
 
     target[k] = source[k]; 
 
    }); 
 
} 
 

 
var data = { "key1": "value1", "key2": "value2", "section1": { "key1_1": "value1_1", "key1_2": "value1_2" }, "section2": { "key2_1": "value2_1", "key2_2": "value2_2", "key2_3": "value2_3" }, "section3": { "key3_1": "value3_1" } }, 
 
    flatObject = {}; 
 

 
flat(data, flatObject); 
 
console.log(flatObject);

バージョン。

function flat(source, target) { 
 
    Object.keys(source).forEach(function (k) { 
 
     var o; 
 
     try { 
 
      o = JSON.parse(source[k]); 
 
      if (o && typeof o === 'object') { 
 
       flat(o, target); 
 
      } else { 
 
       target[k] = o; 
 
      } 
 
     } catch (e) { 
 
      target[k] = source[k]; 
 
     } 
 
    }); 
 
} 
 

 
var data = { "key1": "value1", "key2": "value2", "section1": "{\"key1_1\":\"value1_1\", \"key1_2\":\"value1_2\"}", "section2": "{\"key2_1\":\"value2_1\", \"key2_2\":\"value2_2\", \"key2_3\":\"value2_3\"}", "section3": "{\"key3_1\":\"value3_1\"}" }, 
 
    flatObject = {}; 
 

 
flat(data, flatObject); 
 
console.log(flatObject);

1

あなたは再帰的に自分のデータを横断し、空のマップに追加することができます

var data = { 
 
    "key1":"value1", "key2":"value2", 
 
    "section1":{"key1_1":"value1_1", "key1_2":"value1_2"}, 
 
    "section2":{"key2_1":"value2_1", "key2_2":"value2_2", "key2_3":"value2_3"}, 
 
    "section3":{"key3_1":"value3_1"} 
 
} 
 
var fill = function(carry, obj) { 
 
    for (var key in obj) { 
 
     if (!obj.hasOwnProperty(key)) { 
 
      continue; 
 
     } 
 
     if (obj[key] instanceof Object) { 
 
      fill(carry, obj[key]); 
 
     } 
 
     else { 
 
      carry[key] = obj[key]; 
 
     } 
 
    } 
 
    return carry; 
 
} 
 
var output = {} 
 
fill(output, data); 
 
console.log(output);

関連する問題