如何使用数组的元素作为indexof的参数?

时间:2019-06-16 01:48:48

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

我有两个值数组。我想使用一个数组的元素作为indexof函数的参数。但是,即使我知道该值存在于数组中,我仍然得到-1(表示未找到值)。

我已经通过对indexof参数中的值进行硬编码来测试了这一点,因此在这种情况下,我知道我的问题出在cur_data变量上。当我用cur_data[x]'xyz'进行硬编码时,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]));
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

决定将评论转换为答案:

二维值数组

getValues()方法从Array返回一个二维Range值,该值应通过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本质上是对象,因此适用于对象的比较规则也适用于Array对象。这意味着没有两个对象相等(请看一下比较结果表)。

有用的链接

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