2013-04-27 81 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; 
} 
`