Как получить тело функции стрелки в виде строки?

regex reflection ecmascript-6 arrow-functions

592 просмотра

1 ответ

42205 Репутация автора

Как получить код в виде строки между {}функцией стрелки?

var myFn=(arg1,..,argN)=>{
         /**
          *Want to parse
          * ONLY which is between { and }
          * of arrow function 
         */ 

 };

Если легко разобрать тело простой функции : myFn.toString().match(/function[^{]+\{([\s\S]*)\}$/)[1];достаточно. Однако функция Arrow не содержит functionключевого слова в своем определении.

Автор: Abdennour TOUMI Источник Размещён: 19.07.2016 08:59

Ответы (1)


1 плюс

2884 Репутация автора

Решение

Это моя попытка:

function getArrowFunctionBody(f) {
  const matches = f.toString().match(/^(?:\s*\(?(?:\s*\w*\s*,?\s*)*\)?\s*?=>\s*){?([\s\S]*)}?$/);
  if (!matches) {
    return null;
  }
  
  const firstPass = matches[1];
  
  // Needed because the RegExp doesn't handle the last '}'.
  const secondPass =
    (firstPass.match(/{/g) || []).length === (firstPass.match(/}/g) || []).length - 1 ?
      firstPass.slice(0, firstPass.lastIndexOf('}')) :
      firstPass
  
  return secondPass;
}

const K = (x) => (y) => x;
const I = (x) => (x);
const V = (x) => (y) => (z) => z(x)(y);
const f = (a, b) => {
  const c = a + b;
  return c;
};
const empty = () => { return undefined; };
console.log(getArrowFunctionBody(K));
console.log(getArrowFunctionBody(I));
console.log(getArrowFunctionBody(V));
console.log(getArrowFunctionBody(f));
console.log(getArrowFunctionBody(empty));

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

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

Автор: Frank Tan Размещён: 19.07.2016 06:58
Вопросы из категории :
32x32