使用数组定制对象

时间:2015-03-31 13:53:45

标签: javascript regex

以下代码存在重大缺陷。值类型正在改变。这是"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
}

2 个答案:

答案 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;
  }
});

Try it in a fiddle

答案 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