如何在含小数元素的数组中插入整数并同步填充其他数组?
问题说明
我需要实现一个函数,接收包含5个数组的对象,其中Indexes是核心索引数组。函数要按升序填充索引,其他数组同步对应位置填充0:比如当Indexes是[1,3]时,填充后的索引数组应为[0,1,2,3],其他数组对应索引位置填0,原索引位置保留原值。
但现有代码无法兼容Indexes包含小数(如44.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], }
优化后的代码
function fillMissingValues(csv) { // 解构出索引数组和其他数据数组 const { Indexes, ...dataArrays } = csv; // 获取最大索引值,确定需要覆盖的整数范围 const maxIndex = Math.max(...Indexes); // 生成从0到最大整数索引的完整整数序列 const integerSequence = Array.from({ length: Math.floor(maxIndex) + 1 }, (_, idx) => idx); // 合并整数序列与原索引数组,去重后升序排序,得到完整的索引列表 const filledIndexes = [...new Set([...integerSequence, ...Indexes])].sort((a, b) => a - b); // 构建最终结果对象 const filledCSV = { Indexes: filledIndexes }; // 遍历每个数据数组,按完整索引映射填充值(存在原索引则取对应值,否则填0) Object.entries(dataArrays).forEach(([key, values]) => { filledCSV[key] = filledIndexes.map(index => { const originalPos = Indexes.indexOf(index); return originalPos !== -1 ? values[originalPos] : 0; }); }); return filledCSV; }
代码说明
- 生成完整索引序列:先创建从0到最大索引整数部分的所有整数,再与原索引数组合并,去重排序后得到包含所有必要整数和小数索引的完整序列。
- 映射填充数据:对每个数据数组,遍历完整索引序列,判断当前索引是否存在于原
Indexes中,存在则取对应位置的值,否则填充0。 - 优势:逻辑简洁清晰,完美兼容小数索引场景,避免了原代码中循环递增的复杂逻辑,同时支持任意数量的数据数组(不局限于5个)。
内容的提问来源于stack exchange,提问作者Duex39
相关产品推荐
相关产品推荐

