2013-04-27 78 views
9

我們接收輸入參數值作爲管道分隔鍵值對,與=符號分離分離鍵 - 值對。例如:拆分的管分隔由「=」符號

"|User=0101|Name=ImNewUser|IsAdmin=0|RefId=23ae2123cd223bf235|" 

所以格式是:|KEY=VALUE|KEY_2=VALUE_2|....|KEY_n=VALUE_n|

我需要把它拆分成JSON對象。所以,我的對象應該是:

{ 
'User':'0101', 
'Name':'ImNewUser', 
'IsAdmin':'0', 
'RefId'='23ae2123cd223bf235' 
} 

會是怎樣去最好的方法,因爲可以有多種選擇:

  • 我可以使用拆分與|,並再次與=每個元素分開。
  • 我可以依靠正則表達式並做字符串替換。
  • =刪除尾隨|符號和準2個 不同陣列使用索引拆分它。

任何人都可以告訴我在JavaScript(Node.js中編程)中做到這一點的最好/最有效的方法嗎?

+1

斯普利特|'然後'='。它簡單而高效。如果需要,修剪前導符和尾部符號| |。 – mpen 2013-04-27 07:48:21

回答

31

第一個聽起來不錯:

var str = "|User=0101|Name=ImNewUser|IsAdmin=0|RefId=23ae2123cd223bf235|"; 


var result = {}; 
str.split('|').forEach(function(x){ 
    var arr = x.split('='); 
    arr[1] && (result[arr[0]] = arr[1]); 
}); 
0

我只想用正則表達式來組(見here)每KEY=VALUE對,然後在它們之間迭代,填補了JSON對象。所以,你可以有這樣的事情:

var re = /(([^=\|]+)=([^=\|]+))/g; 
var match; 
var myString = "|User=0101|Name=ImNewUser|IsAdmin=0|RefId=23ae2123cd223bf235|"; 
while (match = re.exec(myString)) { 
    console.log(match); 
    // first iteration returns ["User=0101","User=0101","User","0101"] and so on 
} 
0
var str = "|User=0101|Name=ImNewUser|IsAdmin=0|RefId=23ae2123cd223bf235|"; 


var result = {}, name; 
str.substring(1, str.length-1).split(/\||=/).forEach(function(item, idx){ 
    idx%2 ? (result[name] = item) : (name = item); 
}); 
9

如果你決定使用正則表達式,以確保它的塊搖滾這樣的正則表達式:

var result = {}; 

s.replace(/([^=|]+)=([^|]*)/g, function(noStep3, a, b) { result[a] = b; }); 

regex railroad

+0

#1回答給我,但不需要捕獲'=',簡單地說:'replace(/([^ | = +))=([^ |] +)/ g,函數(_,x,y ){obj [x] = y})' – georg 2013-04-27 08:36:48

+0

@ thg435你就是 - 我有多狠心!我更新了... – 2013-04-27 09:40:35

0

最徹底的方法可能的話,您可以修改源以通過不同的分隔符進行分割。

https://gist.github.com/allensarkisyan/5873977#file-parsequerystring-js上`

`/** 
* @name - parseQueryString 
* @author - Allen Sarkisyan 
* @license - Open Source MIT License 
* 
* @description - Parses a query string into an Object. 
* - Optionally can also parse location.search by invoking without an argument 
*/` 

` 
function parseQueryString(queryString) { 
    var obj = {}; 
    function sliceUp(x) { x.replace('?', '').split('&').forEach(splitUp); } 
    function splitUp(x) { var str = x.split('='); obj[str[0]] = decodeURIComponent(str[1]); } 
    try { (!queryString ? sliceUp(location.search) : sliceUp(queryString)); } catch(e) {} 
    return obj; 
} 
`