在NodeJS中查找和替换的更干净方法?

时间:2019-06-21 09:43:46

标签: javascript node.js lodash

我目前正在尝试读取文件,将内容和多个数组传递给函数;使用正则表达式查看其中是否匹配,然后替换并最终更新。

我编写的看起来丑陋而笨拙的代码是这样的:

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 个答案:

答案 0 :(得分:2)

某些简化可能包括使用Object.entriesArray.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;
},

答案 1 :(得分:0)

使用函数剩余参数(...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"}));