one

by superhead

JavaScript

var sample = [
	"stom-Wt80_S2_L001_R1_001.fastq.gz",
	"stom-Wt80_S2_L002_R1_001.fastq.gz",
	"stom-fb79_S1_L003_R2_001.fastq.gz",
	"stom-fb78_S5_L001_R2_001.fastq.gz",
	"stom-Wt80_S2_L003_R1_001.fastq.gz",
	"stom-Wt80_S2_L001_R2_001.fastq.gz",
	"stom-fb78_S5_L001_R1_001.fastq.gz",
	"stom-fb78_S5_L002_R1_001.fastq.gz",
	"stom-fb78_S5_L003_R1_001.fastq.gz",
	"stom-Wt80_S2_L002_R2_001.fastq.gz",
	"stom-Wt80_S2_L003_R2_001.fastq.gz",
	"stom-fb79_S1_L001_R1_001.fastq.gz",
	"stom-fb79_S1_L002_R1_001.fastq.gz",
	"stom-fb79_S1_L003_R1_001.fastq.gz",
	"stom-fb79_S1_L001_R2_001.fastq.gz",
	"stom-fb79_S1_L001_R2_001.fastq.gz",
	"stom-fb78_S5_L002_R2_001.fastq.gz",
	"stom-fb78_S5_L003_R2_001.fastq.gz",
];

const fileSorter = (fileList) => {
//	find the name of the file
//	find the lane number of file => L
//	find if the sample is forward- or reverse-ended
	let sortedFileList = [];
	let regexPattern = /(.*)_L00(\d{1})_R(\d{1})_001.fastq.gz/gmi;
	const elemIndex = n => fileList.findIndex((elem) => elem["name"] === n);

	const checkNAdd = async(f,fullN,o_type) => {
		sortedFileList[elemIndex(f)][o_type] ??= [];
		await sortedFileList[elemIndex(f)][o_type].push(fullN);
	}

	fileList.map(async(fileName) => {
		let [start,name,lane,ori,end]  = fileName.split(regexPattern);
		await elemIndex(name) === -1 && sortedFileList.push({"name": name});
		await parseInt(ori) === 1 ? checkNAdd(name,fileName,"fwd_files") : checkNAdd(name,fileName,"rev_files");
	})

	return sortedFileList;
}

fileSorter(sample);