【问题标题】:problems creating json file from arrays从数组创建 json 文件的问题
【发布时间】:2018-04-18 22:58:30
【问题描述】:

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

m3u 文件播放列表.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 文件。我做错了什么?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    重构解决方案:或者干脆使用数组的更简洁的.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');
    

    【讨论】:

    • 谢谢,我已经编辑了我使用它的方式。我也意识到你指出的关于搬出 o forEach, :(
    • btw , "filter( l => !l.startsWith("#") )" 假设删除 #EXTM3U not working ,有什么想法吗?我对你使用的这个语法不熟悉
    • 是的,确实如此……也许行首有空格?
    • 你可以先.trim()所有的行。在.split().filter() 之间添加.map( l => l.trim() )
    【解决方案2】:

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

    只需将let savedData = []; 从传递给forEach 的方法中删除

    【讨论】:

    • 抱歉打错了
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2022-01-17
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多