Неопределенная ошибка при попытке доступа к значению массива Map по индексу - PullRequest
0 голосов
/ 06 апреля 2020

Мой код следующий:

let myMap = new Map(
                     [["MMP", ["H1", "-"]], ["TTP", ["H1", "*"]]
);

var array1 = ["MMP", 1, 2]; // array1[0] is the key I want to find in my map

console.log(myMap.get(array1[0]); // Works: gets the values for the given key => [value1,value2]

console.log(myMap.get('example key')[0]); // Works: gets the first element of the array value

console.log(myMap.get(array1[0])[0]); // TypeError: Cannot read property '0' of undefined
                                     // array1[0] is the same as 'example key'

Я не вижу, что я делаю здесь не так. массив1 [0] имеет тип string, такой же, как ключ на моей карте.

Ваша помощь очень ценится!

РЕДАКТИРОВАТЬ: Добавление более полного кода:

var tagSheet = SpreadsheetApp.getActive().getSheetByName('values1');
var docSheet = SpreadsheetApp.getActive().getSheetByName('values2');
var myTagRange = tagSheet.getDataRange();
var myDocRange = docSheet.getDataRange();
var tagValues = myTagRange.getValues();
var docValues = myDocRange.getValues();

function compare(){

  var array1 = []; 

  var columnToCheck = docSheet.getRange("A:A").getValues();

  // Get the last row based on the data range of a single column.
  var docLastColumn = getLastRowSpecial(columnToCheck);

  var tagMap = new Map(getTagMap());


  //Loop over values2 sheet
  for(var n=3;n<docLastColumn;n++){


    array1 = docValues[n][0].split("*");

   if( tagMap.get(array1[0])[0] === 't1'){ //Error here
      Logger.log('passed');
       }

  }

}

function getTagMap() {

  //Select the column we will check for the first blank cell
  var columnToCheck = tagSheet.getRange("A:A").getValues();

  // Get the last row based on the data range of a single column.
  var lastRow = getLastRowSpecial(columnToCheck);
  let myMap = new Map();

   for(var n=1;n<lastRow;n++){ 
     myMap.set(tagValues[n][0].trim(), [tagValues[n][1].trim(),tagValues[n][2].trim()]);
   }

  return myMap;

};


function getLastRowSpecial(range){
  var rowNum = 0;
  var blank = false;
  for(var row = 0; row < range.length; row++){

    if(range[row][0] === "" && !blank){
      rowNum = row;
      blank = true;

    }else if(range[row][0] !== ""){
      blank = false;
    }
  }
  return rowNum;
}

Чтобы сделать это воспроизводимым, создайте лист Google с первым листом с именем values1 и вторым листом с именем values2. Вы должны запустить это в Google Apps Script.

Пожалуйста, смотрите изображения для примеров значений:

значения1 лист

значения2 листа

1 Ответ

1 голос
/ 07 апреля 2020

Проблема:

tagMap не имеет array1[0] key => возвращает undefined => ошибок при доступе к свойству 0 из undefined

TypeError: Невозможно прочитать свойство '0' из неопределенного

Это связано с тем, что к свойству [0] обращаются, как если бы он был массивом, а не неопределенным.

Решение:

Используйте средства защиты кода для проверки и изменения результатов соответствующим образом.

Фрагмент:

const thisMapValue = tagMap.get(array1[0]);
if(thisMapValue && thisMapValue[0] === 't1'){ //ensures  `thisMapValue` is not undefined before accessing `[0]` property
...