我试图将此播放列表文件(如下面的文件)放在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文件。我做错了什么?
感谢。
答案 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');