Как использовать элемент массива в качестве аргумента indexof? - PullRequest
1 голос
/ 16 июня 2019

У меня есть два массива значений. Я хочу использовать элементы одного массива в качестве аргумента функции 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 Ответ

2 голосов
/ 16 июня 2019

Решено преобразовать комментарий в ответ:

2D Массив значений

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() ссылка ;
  2. indexOf() MDN ссылка ;
  3. Сравнения равенства Руководство ;
  4. Сравнения стол ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...