2017-02-14 193 views
0

我想從數組創建多個JSON文件。從數組動態創建Json文件

陣列

[{ 
    "Reference": "Registration", 
    "langkey": "REG_LBL", 
    "English": "Company Registration", 
    "Japanese": "會社登録" 
}, { 
    "Reference": "Registration", 
    "langkey": "INFO_LBL", 
    "English": "Company Information", 
    "Japanese": "會社情報" 
}] 

我需要創建兩個文件JSON名英語和日語(這將是動態的)從上面的數組。

所需的輸出

English.json

{ 
'INFO_LBL' : 'Company Information', 
'REG_LBL':'Company Registration' 
} 

Japanese.json

{ 
'INFO_LBL' : '會社情報', 
'REG_LBL':'會社情報' 
} 

代碼

for (var i = 0; i < data.length; i++) { 
    var obj = data[i]; 
    for (var key in obj) { 
     if (key !=='Reference' && key !== 'langkey') { 
      //{'REG_LBL':'Company Registration'} 

      objects[obj['langkey']] = obj[key]; 
      fs.writeFileSync('lang/' + langkey + '.json', JSON.stringify(objects, null, 2), { encoding: 'utf8' }, function (err) { 
       if (err) 
       { throw err; } 
       console.log("completed") 

      }); 

     } 
    } 
} 

我想創建兩個JSON文件,但內容被另一個覆蓋。請幫助解決此問題?

+0

您可以創建兩個JSON文件。如果你的數組對於每種語言都有多個對象,你需要爲每種語言使用一個對象數組,並將它寫入你的json文件。 – DomeTune

+0

你在哪裏定義你的'langKey'? – DomeTune

+0

你可以包括你如何創建你的json文件 – Merigold

回答

1

你有2個項目在你的數組和2種語言都需要有4個json文件嗎? 2用於INFO_LBL(英語& japanesh)和2用於REG_LBL(英語& japanesh)?或者你只需​​要第二個項目INFO_LBL的2個json文件(英文& japanesh)?

更新:波紋管是你的解決方案

for (var i = 0; i < data.length; i++) { 
    var obj = data[i]; 
    for (var key in obj) { 
     if (key !== 'Reference' && key !== 'langkey') { 
      var newObject = {}; 
      var path = 'lang/' + key + '.json'; 
      if (fs.existsSync(path)) { 
       var newObject = JSON.parse(fs.readFileSync(path, 'utf8')); 
      } 
      newObject[obj.langkey] = obj[key]; 
      fs.writeFileSync(path, JSON.stringify(newObject, null, 2), { encoding: 'utf8' }); 
     } 
    } 
} 
+1

我更新了我的答案。沒有什麼改變,但你只需要獲取已存儲在json文件中的對象。 PS:刪除所有lang/*。json文件之前 – Fetrarij

+0

太棒了!現在它的工作就像一個魅力。感謝很多 – Gopesh

0

這一個工程。我爲每個使用窗口['newVariable']創建了單獨的對象;

var myArray = 

[{ 
    "Reference": "Registration", 
    "langkey": "REG_LBL", 
    "English": "Company Registration", 
    "Japanese": "會社登録" 
}, { 
    "Reference": "Registration", 
    "langkey": "INFO_LBL", 
    "English": "Company Information", 
    "Japanese": "會社情報" 
}]; 

for(i=0; i<myArray.length; i++){ 
    window['myJSON' + i] = myArray[i]; 
} 
console.log(myJSON0, myJSON1); 

這是我得到的,兩個不同的對象

enter image description here

現在,所有你需要做的就是對字符串化JSON。

0

如果你的數據被覆蓋掉了,那將是因爲w​​riteFileSync的。您應該使用appendFileSync或writeFileSync的標誌

2
var finalObject = {};//create new object 

data.forEach(v => { 
    var langkey = v.langkey; 
    Object.keys(v).forEach(val => { 
     if (val != 'langkey' && val != 'Reference') { 
      if (finalObject[val]) {//find if language object is already created.If already created insert in it else create new 
       let data = {}; 
       data[langkey] = v[val] 
       finalObject[val] = Object.assign(finalObject[val], data) 
      } else { 
       finalObject[val] = {}; 
       finalObject[val][langkey] = v[val]; 
      } 


     } 
    }) 
}) 
Object.keys(finalObject).forEach(key => { 
    fs.writeFileSync(path.join(__dirname, `/lang/${key}.json`), JSON.stringify(finalObject[key], null, 2), (err) => { 
     if (err) 
     { throw err; } 
     console.log('completed'); 
    }); 
})