从数组创建json文件的问题

时间:2017-11-06 17:41:11

标签: arrays json node.js underscore.js fs

我试图将此播放列表文件(如下面的文件)放在albums.json文件中但是遇到了麻烦。我也希望这个json对象是uniq。如果有人能指出我正确的方向,我会非常感谢你。

m3u文件playlist.m3u

 #EXTM3U
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-01 Verdi_ La Traviata.mp3
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-02 Gioacchino Rossini_ El Barbero de Sevilla.mp3
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-03 Giacomo Puccini_ La Bohe%CC%80me_ Che Gelida manina.mp3
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-04 Giacomo Puccini_ La Bohe%CC%80me_ Si%CC%80. Mi chiamano Mimi%CC%80.mp3
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-05 Mascagni_ L'amico Fritz.mp3
 file:///Users/user/Music/Various Artists/El Mejor Album de Opera del Mundo/1-06 Verdi_ Nabucco.mp3

...

var allLines = fs.readFileSync('playlist.m3u').toString().split('\n');


 fs.writeFileSync('albums.json', '', function(){console.log('file is empty');});


allLines.forEach(function (line) {

  line = line.replace('file:///Users/user/Music/', '');
  line = line.replace('#EXTM3U','');
  line = urlencode.decode(line); // decoding some chars
  let arr = [];
  let savedData = [];
  let linex = [];
  arr = line.split("/");
  linex["artist"] = arr[0];
  linex["album"] = arr[1];
  linex["size"] = "600x600";

  console.log(linex); // till here it print what i want to print

  savedData.push(linex); // this is not inserting the array
  savedData = _.uniq(savedData); // this is either notworking, because fails before

  fs.writeFile("albums.json",JSON.stringify(savedData),function(err){
    if(err) console.error(err);
    else console.log('Data saved to albums.json file');
  });

});

这种情况下的结果文件是:

[[]] 

如果有很多不同的结果但没有带对象的正确json文件。我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:0)

它应该推动它, 错误是你在forEach的每次迭代中重新初始化变量savedData,这使它再次成为一个空数组。

只需删除传递给forEach

的方法中的let savedData = [];即可

答案 1 :(得分:0)

您的问题:您的代码有两个小错误。它是(1)重新初始化数组let savedData = []和(2)在每fs.writeFile()次迭代时重写输出文件.forEach()

简单解决方案:将两者都移到forEach代码之外;之前的初始化,以及迭代器之后的写入。

重构解决方案或者只是使用数组的更多succint .filter.map方法

let d = fs.readFileSync('playlist.m3u','utf8')
  .split('\n')
  .map( l => l.trim() )
  .filter( l => !l.startsWith('#') )
  .map( l => {
    let [artist, album, title ] = l
      .replace('file:///Users/user/Music/','')
      .split('/');
    return { artist, album, title, size:'600x600' };
  });

fs.writeFileSync('albums.json',JSON.stringify(d),'utf8');