Может использовать функцию один раз, а не дважды, получить неопределенный второй раз - PullRequest
2 голосов
/ 05 мая 2019

РЕДАКТИРОВАТЬ: исправлены фиктивные данные, спасибо за ваш комментарий.

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

Общая идея такова: сохранить только имя, вернуть строку от начала до пробела. НО, если в начале фамилии есть «частица», верните строку с частицей до следующего пробела.

Существует конструктор регулярных выражений, который создает большое регулярное выражение, соответствующее интересной части имени

Этот первый фрагмент запускает функцию users(). Я поместил некоторые закодированные данные для работы, но они должны быть извлечены из электронной таблицы Google. Я получаю сообщение об ошибке, если дважды использую функцию oneName() (пример использования приведен в следующем фрагменте)

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

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri', 'Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for(i in data){
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
    var nom = oneName(data[i][1])[0]
    console.log(nom);
  }
}

function oneName(nom) {
var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}


function regexBuilder(listeParticules){
  var regex = '';
  for(i in listeParticules){
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

Если я использую только функцию oneName (), все в порядке ...

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri, Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for(i in data){
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
  }
}

function oneName(nom) {
var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}


function regexBuilder(listeParticules){
  var regex = '';
  for(i in listeParticules){
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

У меня есть дополнительная проблема: если я использую функцию oneName() только один раз, но я хотел бы использовать ее для извлечения фамилий, она работает с первыми тремя именами, но снова получает "undefined". Эта проблема должна быть как-то связана с моим регулярным выражением, я постараюсь устранить ее отдельно.

Итак, почему я не могу использовать эту функцию дважды?

1 Ответ

1 голос
/ 05 мая 2019

Я думаю, что Комментарий Диего является одной из важных точек модификации.

В качестве еще одной точки модификации: В вашем сценарии после запуска var prenom = oneName(data[i][0])[0] data[i] становится undefined потому что i из for(i in data){} используется как глобальный.После запуска var prenom = oneName(data[i][0])[0]; значение i изменяется в функции regexBuilder().Таким образом, я думаю, что ошибка происходит.

Чтобы избежать этой ошибки, как насчет этой модификации?В этой модификации for(i in data){ был изменен на for(var i in data){.Пожалуйста, подумайте об этом как о двух из нескольких ответов.

Модифицированный скрипт:

users();

function users() {
  var data = [['Jean', 'A Marca'], ['Marie', 'A Marca von Machin'], ['Pierre-Philippe', 'A Marca von machin'], ['Charles-Henri', 'Machin von Truc'], ['Franz Albert', 'All\'Arrabiata von truc'], ['Jérôme', 'all\'arrabiata truc'], ['Heinz', 'n\'Goye'], ['Anne-Méry', 'M\'Bala'], ['Angel', 'Di Maria y Fôdes'], ['Herberto', 'Fôdes y Dos Santos']]
  
  var output = [];
  for (var i in data) { // or for (var i = 0; i < data.length; i++) { // <--- Modified
    var prenom = oneName(data[i][0])[0];
    console.log(prenom);
    var nom = oneName(data[i][1])[0];
    console.log(nom);
  }
}

function oneName(nom) {
  var particules1 = ['de ', 'di ', 'da ', 'dos ', 'von ', 'del\'', 'dell\'', 'della ', 'el ', 'al ', 'd\'', 'do ', 'du ', 'des ', 'de la ', 'a ', 'all\'', 'l\'', 'n\'', 'm\''];
  var particules2 = ['de',  'di',  'da',  'dos',  'von',  'del',   'dell',   'della',  'el',  'al',  'd',   'do',  'du',  'des',  'dela',   'a',  'all' ,  'l',   'n',   'm'];
  var regex = new RegExp(regexBuilder(particules1), 'gi');
  return nom.match(regex);
}

function regexBuilder(listeParticules) {
  var regex = '';
  for(var i in listeParticules){ // Modified
    if(i == listeParticules.length -1){
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|(^[a-zA-Z\u00c0-\u024f\u1e00-\u1eff\']+)';  
    }else{
      regex = regex + '(^' + listeParticules[i] + '[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]+)|';
    }
  }
  return regex;
}

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я прошу прощения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...