Почему многомерный массив выполняет функцию только в каждой ячейке? - PullRequest
0 голосов
/ 25 декабря 2018

Проблема

У меня есть Multidimensional Array и функция с именем conversion().

let variables outside conversion()будет выполняться только в каждой другой ячейке

let variables inside conversion()работает правильно, но вы должны вводить одну и ту же переменную в каждую новую функцию

Что я ищу?

Я хотел бы знать, почему это происходитЕсли бы я знал, почему, то я могу решить проблемуНо на данный момент я не знаю, почему

Работает ... Вроде

Выполняет функцию только в каждой другой ячейке

let MDA = [
  [ '','','UndefineD','nuLL','trUe','fAlsE','TruE','FalSe','NaN','NAN'],
  [ '1', '2', '3', '4', '5', 'TRUE', 'FALSE', '8', '9', '10' ],
  [ 'a', 'TrUe', 'FaLsE', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]
],
    regComma = /\b(,")(.*?(?:(?!\b,".*",).)*)(",)/g,
    regNumber = /^((\s+)?((-)|\.)?)?[\d\.]+(\s+)?$/g,
    regBoolean = /^(\s+)?(true|false)(\s+)?$/gi,
    regUndefined = /^(\s+)?(undefined|null)(\s+)?$/gi,
    regNaN = /^(\s)?nan(\s)?$/gi;

function conversion(str) {
  if (regNumber.test(str)) {return parseInt(str);}
  if (regBoolean.test(str)) {return /t/i.test(str)?true:false;}
  if (regUndefined.test(str)) {return /d/i.test(str)?undefined:null;}
  if (regNaN.test(str)) {return NaN;}
  return str;
}


for(var i = 0; i < MDA.length; i++) {
    let cube = MDA[i];
    for(var j = 0; j < cube.length; j++) {
    let cell = cube[j],
    	convert = conversion(cell);
      MDA[i][j] = convert;
    }
}

console.log(MDA)

Правильно работает

Неэффективно из-за необходимости писать переменныев каждую функцию, которую я хочу предварительно в каждой ячейке.

let MDA = [
  [ '','','UndefineD','nuLL','trUe','fAlsE','TruE','FalSe','NaN','NAN'],
  [ '1', '2', '3', '4', '5', 'TRUE', 'FALSE', '8', '9', '10' ],
  [ 'a', 'TrUe', 'FaLsE', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]
];

function conversion(str) {
  let regComma = /\b(,")(.*?(?:(?!\b,".*",).)*)(",)/g,
      regNumber = /^((\s+)?((-)|\.)?)?[\d\.]+(\s+)?$/g,
      regBoolean = /^(\s+)?(true|false)(\s+)?$/gi,
      regUndefined = /^(\s+)?(undefined|null)(\s+)?$/gi,
      regNaN = /^(\s)?nan(\s)?$/gi;
  if (regNumber.test(str)) {return parseInt(str);}
  if (regBoolean.test(str)) {return /t/i.test(str)?true:false;}
  if (regUndefined.test(str)) {return /d/i.test(str)?undefined:null;}
  if (regNaN.test(str)) {return NaN;}
  return str;
}


for(var i = 0; i < MDA.length; i++) {
    let cube = MDA[i];
    for(var j = 0; j < cube.length; j++) {
    let cell = cube[j],
    	convert = conversion(cell);
      MDA[i][j] = convert;
    }
}

console.log(MDA)

Что я пробовал

Поместил let переменные снаружи conversion()Созданы новые let переменные, на которые ссылаются внешние переменныеНо это работает только на каждой другой ячейке

let MDA = [
  [ '','','UndefineD','nuLL','trUe','fAlsE','TruE','FalSe','NaN','NAN'],
  [ '1', '2', '3', '4', '5', 'TRUE', 'FALSE', '8', '9', '10' ],
  [ 'a', 'TrUe', 'FaLsE', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]
],
  regComma = /\b(,")(.*?(?:(?!\b,".*",).)*)(",)/g,
  regNumber = /^((\s+)?((-)|\.)?)?[\d\.]+(\s+)?$/g,
  regBoolean = /^(\s+)?(true|false)(\s+)?$/gi,
  regUndefined = /^(\s+)?(undefined|null)(\s+)?$/gi,
  regNaN = /^(\s)?nan(\s)?$/gi;

function conversion(str) {
  let r1 = regComma,
      r2 = regNumber,
      r3 = regBoolean,
      r4 = regUndefined,
      r5 = regNaN;
  if (r2.test(str)) {return parseInt(str);}
  if (r3.test(str)) {return /t/i.test(str)?true:false;}
  if (r4.test(str)) {return /d/i.test(str)?undefined:null;}
  if (r5.test(str)) {return NaN;}
  return str;
}


for(var i = 0; i < MDA.length; i++) {
    let cube = MDA[i];
    for(var j = 0; j < cube.length; j++) {
    let cell = cube[j],
    	convert = conversion(cell);
      MDA[i][j] = convert;
    }
}

console.log(MDA)

1 Ответ

0 голосов
/ 25 декабря 2018

Из документации

test(), вызываемой несколько раз в одном и том же экземпляре глобального регулярного выражения, будет предшествовать предыдущему совпадению.

Если регулярное выражениеесли установлен глобальный флаг, test() будет продвигать lastIndex регулярного выражения.Последующее использование test() начнет поиск с substring из str, указанного в lastIndex (exec() также улучшит свойство lastIndex).Стоит отметить, что lastIndex не будет сброшен при тестировании другой строки.

Следовательно, это вызвало такое поведение.Удаление g из регулярного выражения даст вам ожидаемое поведение.

const MDA = [
  [ '','','UndefineD','nuLL','trUe','fAlsE','TruE','FalSe','NaN','NAN'],
  [ '1', '2', '3', '4', '5', 'TRUE', 'FALSE', '8', '9', '10' ],
  [ 'a', 'TrUe', 'FaLsE', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]
];
  
const  regComma = /\b(,")(.*?(?:(?!\b,".*",).)*)(",)/,
    regNumber = /^((\s+)?((-)|\.)?)?[\d\.]+(\s+)?$/,
    regBoolean = /^(\s+)?(true|false)(\s+)?$/i,
    regUndefined = /^(\s+)?(undefined|null)(\s+)?$/i,
    regNaN = /^(\s)?nan(\s)?$/i;

function conversion(str) {
  if (regNumber.test(str)) {return parseInt(str);}
  if (regBoolean.test(str)) {return /t/i.test(str)?true:false;}
  if (regUndefined.test(str)) {return /d/i.test(str)?undefined:null;}
  if (regNaN.test(str)) {return NaN;}
  return str;
}


for(var i = 0; i < MDA.length; i++) {
    const cube = MDA[i];
    for(var j = 0; j < cube.length; j++) {
    const cell = cube[j],
    	convert = conversion(cell);
      MDA[i][j] = convert;
    }
}

console.log(MDA);

Отличный вопрос.Спасибо за это.

...