以下代码存在重大缺陷。值类型正在改变。这是"limit": 5
和"skip": 0
正在转换为字符串的值。
var arr = [
'find({ qty: { $lt: 20 } } )',
'limit(5)',
'skip(0)'
]
var obj = {};
arr.forEach(function(x, n) {
var m = x.match(/(\w+)\(\s*(.+?)\s*\)/);
if(n == 0) {
obj.action = m[1];
obj.value = m[2];
} else
obj[m[1]] = m[2];
});
document.write("<pre>" + JSON.stringify(obj,0,3));
预期产出:
{
"action": "find",
"value": "{ qty: { $lt: 20 } }",
"limit": 5,
"skip": 0
}
答案 0 :(得分:1)
在将m[2]
分配给obj
中的密钥之前,请检查它是否为数字。如果是,请解析它:
arr.forEach(function(x, n) {
var m = x.match(/(\w+)\(\s*(.+?)\s*\)/);
if(n == 0) {
obj.action = m[1];
obj.value = m[2];
} else{
var key = m[1], val = m[2];
if (!isNaN(val)) {
val = parseInt(val);
}
obj[key] = val;
}
});
答案 1 :(得分:0)
我不完全确定您的代码尝试实现的目标,但您可以尝试将值转换为Numbers,然后再将它们添加到对象中。
像这样:
arr.forEach(function(x, n) {
var m = x.match(/(\w+)\(\s*(.+?)\s*\)/);
if(n == 0) {
obj.action = m[1];
obj.value = !isNaN(m[2]) ? Number(m[2]) : m[2];
} else
obj[m[1]] = !isNaN(m[2]) ? Number(m[2]) : m[2];
});
这是CodePen。