如何遍历一组值以优化对函数的调用次数?

时间:2018-06-28 22:02:13

标签: javascript arrays algorithm performance google-sheets

我有一个Google电子表格中的行数组,其中的数字介于1到800之间:

var rowPositions = [1,3,4,5,9,10,11,12...795,799,800]

并且,为了提高效率,我需要对函数deleteRows进行API调用,该函数接受两个参数:

deleteRows(positionOfFirstRow, howManyRowsShouldBeDeletedStartingFromFirstRow)

Google Documentation for deleteRows.

如何在Javascript中创建一个函数,以给定数组最小次数地调用deleteRows? IE,以上述数组为例,该函数调用deleteRows以删除位置1的行,然后再次调用以删除3、4、5,然后再次删除10、11、12等...? / p>

换句话说,如何将rowPositions数组转换为二维数组,例如:

var 2DrowPositions = [[1,1],[3,2],[5,1],[9,4]]

然后我可以使用它在每个提供的坐标处调用一次deleteRows函数。

1 个答案:

答案 0 :(得分:1)

如果给您要删除的项目数组,如[1, 3, 4, 5, 7, 8, 9, 15, 18, 19, 20, 23],则可以遍历该数组并查找连续的数字。跟踪看到的连续数字以及当您击中非连续数字时,保存旧的数字并重新开始。

这是做到这一点的一种方法,它相当容易阅读:

let del = [1, 3, 4, 5, 7, 8, 9, 15, 18, 19, 20, 23]

let res = []
let curr = {start: del[0], count: 0}
del.forEach((item, i, arr) => {
    if (i === 0 || arr[i] === 1 + arr[i-1]) curr.count++
    else {
        res.push(curr)
        curr = {start: arr[i], count:1}
    }
})
res.push(curr)
console.log(res)

这将返回{start, count}形式的对象数组,您可以在函数中使用类似以下内容的对象:

res.forEach(r => deleteRows(r.start, r.count))