2017-02-14 115 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'); 
    }); 
})