我有这个字符串"{ 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
。
答案 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);
这将创建一个数组,而不将所有内容都变成字符串。