【问题标题】:How to cycle through an array of values to optimize number of calls to a function?如何循环遍历一组值以优化对函数的调用次数?
【发布时间】:2018-06-28 22:02:12
【问题描述】:

我有一组来自 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 函数。

【问题讨论】:

  • 是的,我相信是的。 @大卫托马斯
  • 请记住,我确实发布了无效的 JavaScript,它应该是:[[1,1],[3,3]]。我的错。我建议仔细考虑您想要的最终结果,并在您的问题中发布所需的结果,以及您对如何使用您的解决方案的理解;这样人们就更有可能了解如何提供帮助。

标签: javascript arrays algorithm performance google-sheets


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    相关资源
    最近更新 更多