2015-03-13 231 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