我将一个包含 5 个数组的对象传递给我的函数。其中一个属性称为“索引”。这个函数的作用是按升序用零填充数组,所有其他数组都遵循 Indexes 数组作为索引,因此如果 Indexes 数组是 [1,3] ,它将用 [1,2,3] 填充它,所有数组的位置 2 均为 0。
我的问题是,当索引包含 0.5(与工作相关,所以我必须使用它)时,如果我有 [43, 44.5, 45],我想得到 [43, 44, 44.5, 45]。但我编写代码的方式似乎完全跳过了整数,而且我认为我让自己变得比需要的更复杂。
这是函数
function fillMissingValues(csv) {
const indexes = csv.Indexes;
const allReads = csv['All reads'];
const trimmedByAdapterOrQuality = csv['Trimmed by Adapter or Quality'];
const trimmedByAdapter = csv['Trimmed by adapter'];
const trimmedByQuality = csv['Trimmed by quality'];
const filledIndexes = [];
const filledAllReads = [];
const filledTrimmedByAdapterOrQuality = [];
const filledTrimmedByAdapter = [];
const filledTrimmedByQuality = [];
let lastIndex = 0;
for (let i = 0; i < indexes.length; i++) {
const index = indexes[i];
const value = allReads[i];
const taq = trimmedByAdapterOrQuality[i];
const ta = trimmedByAdapter[i];
const tq = trimmedByQuality[i];
while (lastIndex < index) {
filledIndexes.push(lastIndex);
filledAllReads.push(0);
filledTrimmedByAdapterOrQuality.push(0);
filledTrimmedByAdapter.push(0);
filledTrimmedByQuality.push(0);
lastIndex++;
}
filledIndexes.push(index);
filledAllReads.push(value);
filledTrimmedByAdapterOrQuality.push(taq);
filledTrimmedByAdapter.push(ta);
filledTrimmedByQuality.push(tq);
lastIndex++;
}
// Fill the remaining indexes with zeros
const maxIndex = Math.max(...indexes);
while (lastIndex <= maxIndex) {
filledIndexes.push(lastIndex);
filledAllReads.push(0);
filledTrimmedByAdapterOrQuality.push(0);
filledTrimmedByAdapter.push(0);
filledTrimmedByQuality.push(0);
lastIndex++;
}
const filledCSV = {
Indexes: filledIndexes,
'All reads': filledAllReads,
'Trimmed by Adapter or Quality': filledTrimmedByAdapterOrQuality,
'Trimmed by adapter': filledTrimmedByAdapter,
'Trimmed by quality': filledTrimmedByQuality
};
return filledCSV;
}
传递数据的示例,
csv = {
Indexes:[ 3, 4, 6.5, 8]
'All reads': [1, 2, 3, 4],
'Trimmed by Adapter or Quality': [1, 2, 3, 4],
'Trimmed by adapter': [1, 2, 3, 4],
'Trimmed by quality': [1, 2, 3, 4],
}
所以输出应该是
filledCSV = {
Indexes:[0, 1, 2, 3, 4, 5, 6, 6.5, 7, 8]
'All reads': [0, 0, 0, 1, 2, 0, 0, 3, 0, 4],
'Trimmed by Adapter or Quality': [0, 0, 0, 1, 2, 0, 0, 3, 0, 4],
'Trimmed by adapter': [0, 0, 0, 1, 2, 0, 0, 3, 0, 4],
'Trimmed by quality': [0, 0, 0, 1, 2, 0, 0, 3, 0, 4],
}
创建一个包含从 0 到
Math.max(...indexes)
的所有整数的数组。
将
indexes
合并到此数组中,删除重复项,然后对其进行排序。
循环这个组合数组。如果该元素在
indexes
中,则将所有其他属性的对应元素推入filledCSV
中的对应属性中。如果没有,请按0
。
const csv = {
Indexes: [3, 4, 6.5, 8],
'All reads': [1, 2, 3, 4],
'Trimmed by Adapter or Quality': [5, 4, 3, 2],
'Trimmed by adapter': [5, 10, 15, 20],
'Trimmed by quality': [10, 15, 18, 30],
}
const filledCSV = Object.fromEntries(Object.keys(csv).map(key => [key, []]));
let maxIndex = Math.max(...csv.Indexes);
let origIndexMap = Object.fromEntries(csv.Indexes.map((index, i) => [index, i]));
let filledIndexes = [...new Set([...Array(maxIndex).keys(), ...csv.Indexes])];
filledIndexes.sort((a, b) => a - b);
filledCSV.Indexes = filledIndexes;
filledIndexes.forEach(index => {
let origIndex = origIndexMap[index];
Object.entries(filledCSV).forEach(([key, array]) => {
if (key != 'Indexes') {
array.push(origIndex === undefined ? 0 : csv[key][origIndex]);
}
});
});
console.log(filledCSV);