【问题标题】:How to use an element of an array as an argument of indexOf method?如何使用数组的元素作为 indexOf 方法的参数?
【发布时间】:2019-06-16 01:48:48
【问题描述】:

我有两个值数组。我想使用一个数组的元素作为indexOf 函数的参数。但是即使我知道数组中存在该值,我也会得到一个-1(意思是未找到值)。

我已经通过硬编码indexOf 的参数中的值来测试这一点,所以我知道在这种情况下我的问题在于cur_data 变量。当我用'xyz'cur_data[x] 进行硬编码时,indexOf 返回正确的索引,但是当我使用数组值[xyz] 时,它返回-1

我做错了什么?

function iterateSheets() {
  var price_data = SpreadsheetApp.openById('1Nttb7XqUlZwGtmwbcRc3QkY3f2rxx7XdsdEU3cK4K4').getSheetByName('price').getRange("A2:A353").getValues()
  var price_data2 = price_data.map(function(r) {
    return r[0];
  });
  var test = new Array(30)
  var ts = SpreadsheetApp.openById('18qFvVMVEE1k5DWUYaSezKeobcLr8I4oAmHLUpd_X99k');
  var allShts = ts.getSheets();

  for (var i = 0; i < 1; i++) //allShts.length   //need to add in code to make sure tab is one of the fcst tabs  
  {
    var cur_data = allShts[i].getRange("B8").getValues()
    if (allShts[i].getName() == "July" || allShts[i].getName() ==
      "Aug" || allShts[i].getName() == "Sept") {

      for (var x = 0; x < 1; x++) {
        Logger.log(cur_data[x])
        Logger.log(price_data2.indexOf(cur_data[x]));
      }
    }
  }
}

【问题讨论】:

  • 请您分享您的电子表格,或者至少分享电子表格中的一些数据,以便我们重现您的错误。您是否还包括执行记录。
  • 顺便说一句,您能否澄清一下cur_data[x] 是否是Array 的一个实例(没关系,从代码来看,它是Array 的一个实例)?似乎问题是由于 getValues() 方法总是返回一个 2D Array 并且,因为对象到对象的直接比较总是返回 falseindexOf() uses strict comparison 来查找值,你的 {Array}.indexOf({Array}) 总是结果在-1.
  • 你使用了getValues,所以用完整的二维数组地址描述cur_data。这对我有用。 var c = price_data2.indexOf(cur_data[0][0]);`Logger.log("c = "+c);'

标签: javascript arrays for-loop google-apps-script google-sheets


【解决方案1】:

二维值数组

getValues() 方法从Range 中返回一个二维的Array 值,应该通过values[row][column] 模式访问。 for 循环只增加第一个维度,即行,并且从不通过列引用访问值。因此,您最终将Array 实例传递给indexOf() 方法。

修改

您可以添加第二个for 循环来遍历值Array 的每个元素,并修改第一个循环以使其更加灵活,以防万一您需要遍历多行:

for (var x = 0; x < cur_data.length; x++) {
  for (var y = 0; y < cur_data[x].length; y++) {
    Logger.log(cur_data[x][y])
    Logger.log(price_data2.indexOf(cur_data[x][y]));    
  }
}

比较

indexOf() 方法通过严格相等比较执行搜索,这就是有趣的部分开始的地方。因为Array 实例也是Objects,这意味着适用于对象的相同比较规则也适用于它们。这意味着没有两个对象是相等的(看看comparison result table)。

有用的链接

  1. getValues()reference;
  2. indexOf()MDN reference;
  3. 平等比较guide;

【讨论】:

  • 如果您要添加一行“确切地”显示 OP 应如何编写 indexof 代码,这将更有帮助。如“使用:price_data2.indexOf(cur_data[0][0]);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2016-10-09
  • 2022-06-15
相关资源
最近更新 更多