如何在数组中带有小数的元素之间插入整数?

问题描述 投票:0回答:1

我将一个包含 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],
}
javascript arrays loops
1个回答
0
投票

创建一个包含从 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);

© www.soinside.com 2019 - 2024. All rights reserved.