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

标签 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等...?

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

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

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

最佳答案

如果给定一组要删除的项目,例如 [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))

关于javascript - 如何循环遍历一组值以优化对函数的调用次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51091765/

相关文章:

javascript - Chart.js V2。具有固定 y 轴的条形图

javascript - Jqplot 图中最后一个柱的情况

javascript - 使 li 项目框按顺序弹出 jQuery

xcode - Mac OSX 10.7.4,Xcode 4.4.1,没有 <array> 头文件?

c 打印指针指向的数组的地址

python - 从方阵组成边

algorithm - 按年龄对一组人进行排序的最快方法是什么?

javascript - 如何使用 jQuery 在源区域和目标区域之间移动可拖动对象

arrays - 如何在Scala中将Option数组初始化为None

algorithm - 找出一个点到许多其他点的 n 个最短欧氏长度的高效算法