14

我们接收输入参数值作为管道分隔的键值对,用=符号分隔。例如:

"|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'
}

最好的方法是什么,因为有多种选择:

  • 我可以|在每个元素上使用 split with 并再次使用 split with =
  • 我可以依赖正则表达式并进行字符串替换。
  • =用删除尾随符号拆分它,|并将两个不同的数组与索引相关联。

谁能告诉我在 JavaScript 中最好/最有效的方法(在 Node.js 中编程)?

4

6 回答 6

39

第一个听起来不错:

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]);
});
于 2013-04-27T07:42:49.503 回答
12

如果您决定使用正则表达式,请确保它像这样阻止摇滚正则表达式:

var result = {};

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

正则表达式铁路

于 2013-04-27T08:06:35.230 回答
1

无突变

你不需要外管。如有必要,将它们修剪掉str.slice(1, str.length - 1)

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

str.split('|').reduce((accum, x) => { 
  const kv = x.split('=');
  return {...accum, ...{[kv[0]]: kv[1]}};
}, {})
于 2018-04-05T17:40:11.500 回答
0

我只会使用正则表达式对每对进行分组(参见此处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
}
于 2013-04-27T07:43:23.983 回答
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); 
});
于 2013-04-27T07:46:53.683 回答
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;
}
`
于 2013-06-27T04:45:15.710 回答