You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在含小数元素的数组中插入整数并同步填充其他数组?

问题说明

我需要实现一个函数,接收包含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;
}

代码说明

  1. 生成完整索引序列:先创建从0到最大索引整数部分的所有整数,再与原索引数组合并,去重排序后得到包含所有必要整数和小数索引的完整序列。
  2. 映射填充数据:对每个数据数组,遍历完整索引序列,判断当前索引是否存在于原Indexes中,存在则取对应位置的值,否则填充0。
  3. 优势:逻辑简洁清晰,完美兼容小数索引场景,避免了原代码中循环递增的复杂逻辑,同时支持任意数量的数据数组(不局限于5个)。

内容的提问来源于stack exchange,提问作者Duex39

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:47:03