【问题标题】:Problem using .splice() in Google App Script在 Google App Script 中使用 .splice() 时出现问题
【发布时间】:2019-01-27 10:30:24
【问题描述】:

我正在尝试使用 Google App Script 中的拼接提取二维数组的子集。 A 是从中创建两个数组 info[] 和 ttdata[] 的输入数组。以下是代码:

function SpliceTest()
{
  var A = [[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6], 
  ["","","","1","",""],["","","","","2",""]]
  Logger.log(A)      
   var spliced = SpliceData(A)
  Logger.log(A)
}

function SpliceData(data)
{
  var info = []
  var ttdata = []
  for(var j = 0; j < 2; j++)
   {
     info[j] = data[j].splice(4, 2)
  }
  for(var j = 2; j < data.length; j++)
  {
     ttdata[j-2] = data[j].splice(0, 4)
   }
   return [info, ttdata]
 }

问题是,执行 spliceData 子例程会修改输入数组 A,我无法理解。

下面是SpliceData子程序执行前后A的值。

[19-01-25 11:28:05:493 CET] [[1.0, 2.0, 3.0, 4.0, 5.0, 6.0], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0], [, , , 1, , ], [, , , , 2, ]]
[19-01-25 11:28:05:494 CET] [[1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0], [5.0, 6.0], [, ], [2, ]]

【问题讨论】:

  • 你有什么不明白的?预期的输出是什么?
  • 您的意思可能是slice 而不是splice。拼接明确意味着将某物从一个地方移植到另一个地方,例如“基因剪接”。
  • 我希望提取 A 的 2 个子集并将它们放入数组 info[] 和 ttdata[] 中。这部分我实现了,但我还需要现在丢失的原始 A。我不明白这部分为什么要修改 A。
  • 为什么不在开始之前复制数组 A。
  • 我也尝试复制数组。但是副本也会在执行 splice 子程序后被修改。

标签: javascript arrays google-apps-script


【解决方案1】:

在这里,正如 Tehhowch 在评论中提到的那样,您需要 slice() 而不是 splice()

此外,如果您仔细阅读文档,您会注意到 splice 修改了原始数组,而 slice 对其进行了浅拷贝。

function SpliceTest()
{
  var Logger = console
  var A = [[1,2,3,4,5,6],[1,2,3,4,5,6],[1,2,3,4,5,6], 
  ["","","","1","",""],["","","","","2",""]]

   var spliced = SpliceData(A)
  Logger.log("Spliced Array:")
  Logger.log(spliced)
  Logger.log("Original Array A:")
  Logger.log(A)
}

function SpliceData(data)
{
  var info = []
  var ttdata = []
  for(var j = 0; j < 2; j++)
   {
     info[j] = data[j].slice(4)
  }
  for(var j = 2; j < data.length; j++)
  {
     ttdata[j-2] = data[j].slice(0, 4)
   }
   return [info, ttdata]
 }
 SpliceTest()

注意:我修改了代码,即var Logger = console,以便它可以在此处作为代码 sn-p 运行!

【讨论】:

  • 看来 slice() 也修改了数组。事先制作副本也无济于事。
  • 我正在运行上面的代码sn-p,它并没有修改数组A。
  • 还要注意splice和slice之间语法的细微变化!
  • @Partha 了解浅拷贝和深拷贝之间的区别。
  • @Jack Brown,Tehhowch,使用 slice() 解决了问题。感谢您的帮助。
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 2019-10-08
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多