2015-03-13 150 views
3

我有一个数组,下面的元素。我正尝试从数组中创建一个对象从数组创建自定义对象

var arr = [ 
    'find({ qty: { $lt: 20 } })', 
    'limit(5)', 
    'skip(0)' 
] 

以下是我的代码。在那里我只获得值作为输出。任何帮助,将有助于

for (var i = 0; i < arr.length; i++) { 
     var res = arr[i].search(/\(/ig) 
     if (res!= -1) { 
      var result = arr[i].split("("); 
      result = result[1].slice(0, -1)) 
     } 
    } 

期望输出

{ 
     "action": "find", 
     "value": "{ qty: { $lt: 20 } }", 
     "limit": 5, 
     "skip": 0 
    } 

回答

2

看到这个fiddle

只是检查是否元素是首次在阵列中,如果有,将动作和值键分割阵列,否则只需分别分配键值和值分别为

var arr = [ 
 
    'find({ qty: { $lt: 20 } })', 
 
    'limit(5)', 
 
    'skip(0)' 
 
] 
 
var result = {}; 
 
for (var i = 0; i < arr.length; i++) { 
 
    var res = arr[i].split("(") 
 
    console.log(res) 
 
    result[res[0]] = res[1].split(')')[0] 
 
} 
 

 
document.write(JSON.stringify(result))

3

matchsplit帮助我更好地为这种东西

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));

+0

感谢所有。现在我得到预期的输出。是否有可能使对象不是字符串({qty:{$ lt:20}})。 { “行动”: “发现”, “值”: “{数量:{$ LT:20}}”, “极限”:5, “跳过”:0 } – user4324324 2015-03-13 18:35:21

+0

@ user4324324请考虑接受一个答案,如果它帮助你解决你的问题。 – mish 2015-03-19 10:05:27

+0

@mish你的代码正在工作,但有一个主要缺陷。 { “动作”: “找到”, “值”: “{数量:{$ LT:20}}”, “极限”: “5”, “跳过”: “0” } 值是转换为字符串。例如。 “限制”:5 – user4324324 2015-03-31 13:49:44