【问题标题】:How to convert string to object to be able to pass that as a function parameters如何将字符串转换为对象以便能够将其作为函数参数传递
【发布时间】:2019-03-20 09:19:56
【问题描述】:

我有这个字符串"{ 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

【问题讨论】:

  • @DaleBurrell — 它不是有效的 JSON,请不要引用 w3schools。 MDN 和 ECMA-262 是更好的参考。
  • 但是您可以轻松地将其转换为 JSON。
  • 将其解析为 JSON 可能并不比在不使用 JSON.parse 的情况下将其解析为对象更容易。
  • @RobG w3schools 现在被认为是很多事情的好资源

标签: javascript typescript


【解决方案1】:

简答:评估。

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

【讨论】:

  • 我认为 eval 在这里没有帮助。我刚刚在 stackblitz 中尝试过,它返回 Error: unexpected token: ':' 更新:实际上我忘记在字符串中的值周围包含 ()。它工作正常。
【解决方案2】:

您可以将 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】:

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

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

    话虽如此,我们必须想出某种形式的变换函数 您可以使用 splits 将函数分成单独的参数,然后使用 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 将具有一个参数的较小对象组合成一个较大的对象。

    【讨论】:

    • 具有可变深度的对象呢?
    • @slider——解析器的复杂性只需要足以处理它正在解析的数据。鉴于 OP 的示例,它只需要相当简单。
    【解决方案4】:

    编辑如下所述,这不是有效的 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);
    

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

    【讨论】:

    • 请注意,该字符串不是有效的 JSON。
    • 一开始我确实尝试过,但没有成功
    • 这会将数字更改为字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多