Более чистый подход, чтобы найти и заменить в NodeJS? - PullRequest
0 голосов
/ 21 июня 2019

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

Код, который я собрал, выглядит уродливо и комично:

find_and_replace: function(file, ...items) {
    let str = _.clone(file);
    let valid = {};
    let do_escape = true;
    let hit;
    if (items != null ? items.length : void 0) {
        for (let i = 0, len = items.length; i < len; i++) {
            let obj = items[i];
            try {
                for (k in obj) {
                    let v = obj[k];
                    if (valid[k] == null) {
                        valid[k] = v;
                    }
                }
            } catch (error) { }
        }
        try {
            str = str.replace('/{{([\s\S]+?)}}/g', function(a, b) {
                if (hit = valid[b]) {
                    if (do_escape) {
                        return escape(hit);
                    } else {
                        return hit;
                    }
                }
                return '';
            });
        } catch (error) {
            console.log(error);
        }
    }
    return str;
},

Функция используется следующим образом:

for (let _i = 0, _len = files.length; _i < _len; _i++) {
    let x = files[_i];
    if(x.includes('node_modules')) {
        continue;
    }
    builder.find_and_replace(builder.read_file(x), main_config, second_config);
    break;
}

Функциональность этой "системы" состоит в том, чтобы находить любые {{tag}} заполнители из файла и заменять на правильный ключ из ...items объединенного массива

Я был бы очень признателен, если бы кто-нибудь указал мне правильное направление, чтобы уменьшить количество требуемого кода.

Ответы [ 2 ]

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

Некоторое упрощение может включать использование Object.entries или Array.reduce методов

function find_and_replace(file, ...items) {
  let str = _.clone(file);
  let do_escape = true;
  let hit;

  if (items != null ? items.length : void 0) {
    const valid = items.reduce((valid, obj) => {
      Object.entries(obj)
        .map([k, v] => {
          valid[key] = v;
        });
      return valid;
    }, {});

    try {
      str = str.replace('/{{([\s\S]+?)}}/g', (a, b) => hit === valid[b] ? (do_escape ? escape(hit) : hit) : '');
    } catch (error) {
      console.log(error);
    }
  }
  return str;
},
0 голосов
/ 21 июня 2019

Когда вы используете параметры отдыха функции (...items), вы всегда получаете массив под items, поэтому if (items != null ? items.length : void 0) является избыточным.

items.reduce((all, obj) => ({...all, ...obj}), {}) создает отдельный объект из ...items

(string, [key, value]) => string.replace(new RegExp(`{{${key}}}`, "gi"), value) найдет все вхождения ключей от объекта и заменит их значениями

const tr = (string, ...items) => "" + Object.entries(items.reduce((all, obj) => ({...all, ...obj}), {})).reduce((string, [key, value]) => string.replace(new RegExp(`{{${key}}}`, "gi"), value), string);

console.log(tr("{{h}} {{w}}!", {h:"Hello"}, {w:"world"}));
...