从反应状态对象上的字符串调用函数

时间:2019-02-27 21:42:06

标签: javascript reactjs function eval

我正在使用DataFrame-js并在React-Material卡中显示CSV。 我添加了一个输入(ace编辑器),以便可以创建Web控制台来针对数据框调用函数。 我正在使用React。 我的组件有一个state变量dataframe,用于保存数据框。该数据框具有许多可用功能,例如this.state.dataframe.show() this.state.dataframe.stats.max('column')等。

我创建了一个函数,该函数接收用户的输入,并针对数据框调用该函数……除非它不起作用。我希望用户能够例如输入stats.max('column'),并且它会针对数据框运行:

  ExecuteAgainstDataFrame = evt => {
    //we need to split on the brackets
    const input = evt.getValue().split("(")
    //and pass the content of the brackets as arguments to the function
    const df = this.state.dataframe
    //split the function names on the dot (members)
    const functionNames = input[0].split(".")
    //create a variable that references the function on the dataframe
    let applyToFunction = df
    for (let i = 0, l = functionNames.length; i < l; i++) {
      applyToFunction = applyToFunction[functionNames[i]]
    }
    //process any inputs
    let functionArguments = []
    if (input.length > 1) { //there were some parameters
      //removing the closing bracket and creating an array of the arguments
      functionArguments = input[1].split(")")[0].split(",")
    } else {
      const result = applyToFunction()
      return result
    }
    //call the function, this time with the arguments
    const result = applyToFunction.apply(null, functionArguments)
    return result
  }

如果我直接调用数据框,就像这样

const input = evt.getValue().split("(")
//and pass the content of the brackets as arguments to the function
const df = this.state.dataframe
df[input[0]]()
return false

然后它起作用。否则我会得到错误 enter image description here

我一直在阅读并尽一切可能避免使用eval,但实际上使用它似乎要复杂得多

0 个答案:

没有答案