如何将字符串转换为对象以能够将其作为函数参数传递

时间:2018-10-15 22:01:18

标签: javascript typescript

我有这个字符串"{ min: 1, max: 10, precision: 3 }"

我想将其转换为{ min: 1, max: 10, precision: 3 },所以我可以将其作为参数传递给某些函数faker.random.number({ min: 1, max: 10, precision: 3 })

在这种情况下,您将如何进行转换?

更新: 当我使用eval("faker.random.number({ min: 0, max: 10, precision: 1 })")时遇到错误faker is not defined

4 个答案:

答案 0 :(得分:1)

简短的回答:评估。

长答案:不要使用eval。使您的数据采用标准格式(例如JSON),并使用工具来解析所述标准格式(例如JSON.parse()

答案 1 :(得分:1)

很多人建议使用JSON.parse函数,但这不是有效的json格式。所以它只会返回 SYNTAX ERROR: Unexpected token a in JSON

我想到的是使用eval函数,但是由于第二个参数(2)不是对象中的有效键,因此再次使用该函数将无效。

话虽如此,我们必须想出某种形式的转换函数 您可以使用split将函数划分为单独的参数,然后使用replace删除不必要的空格/括号

var str = "{ a: 1, 2: 10, c: 3 }";
Object.assign({}, ...str.split(",").map(param => {
    param = param.replace("{", "").replace("}", "").split(":")
        .map(a=>a.replace(" ", ""));
    let object = {};
    object[param[0]]=param[1];
    return object;
}))
//returns {'2': 10, a: 1, c: 3}

之后,直接将“:”之前的第一部分分配给键,将另一部分分配给值。然后,我将具有一个参数的较小对象组合为带有object.assign的较大参数。

答案 2 :(得分:1)

您可以将 eval 与以下内容一起使用:

faker.random.number(eval('void 0,' + '{ min: 1, max: 10, precision: 3 }'));

'void 0,部分是必需的,就像遇到语句中的第一个标记是{一样,它被视为块的开始而不是对象文字。

无论如何,您要避免使用 eval ,因此您必须手动解析字符串。希望它不会变得太复杂,您可以像下面这样使它保持简单,它可以处理字符串或数字值,但不能处理太多其他事情:

var s = '{ min: 1, max: 10, precision: 3 }';

function simpleParse(s) {

  // Remove unwanted characters, split into name:value pairs on ,
  let parts = s.replace(/[ {}]/g,'').split(',');

  // Split properties on : and keep strings as strings, assume
  // anything else is a number
  return parts.reduce((acc, part) => {
    let [prop, value] = part.split(':');
    acc[prop] = /[\'\"]/.test(value)? value : +value;
    return acc;
  }, Object.create(null));
}

console.log(simpleParse(s));

您可以将字符串转换为JSON,然后使用JSON.parse,但是我看不到将其解析两次的意义。如果结构变得更复杂,则需要更复杂的解析器。

答案 3 :(得分:-1)

编辑如下所述,这不是有效的JSON,所以我喜欢这个难题:P我的最终解决方案:

var str = "{ a: 1, 2: 10, c: 3 }";
obj = str.replace(/[ {}]/g, "").split(",");
new_obj = {};
obj.forEach(function(element) {
    var t = element.split(':');
    new_obj[t[0]] = t[1];
});
console.log(new_obj);

这将创建一个数组,而不将所有内容都变成字符串。