从数组创建 json 文件时出现问题
problems creating json file from arrays
我试图将此播放列表文件(如下面的文件)放入 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 对象文件。伙计们,我做错了什么?
谢谢。
应该是推吧,
错误是您在 forEach 的每次迭代中都重新初始化变量 savedData,这使它再次成为一个空数组。
只需从传递给 forEach
的方法中删除 let savedData = [];
你的问题:你的代码有两个小错误。它是 (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');
我试图将此播放列表文件(如下面的文件)放入 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 对象文件。伙计们,我做错了什么?
谢谢。
应该是推吧, 错误是您在 forEach 的每次迭代中都重新初始化变量 savedData,这使它再次成为一个空数组。
只需从传递给 forEach
的方法中删除let savedData = [];
你的问题:你的代码有两个小错误。它是 (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');