我们收到一个输入参数值作为管道分隔的键值对,用=
符号分隔。例如:
"|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'
}
最好的方法是什么,因为有多种选择:
|
拆分,并再次使用=
拆分每个元素。=
删除尾随|
符号并关联两个
带索引的不同数组。有谁可以告诉我在JavaScript中进行此操作的最佳/最有效方法(在Node.js中编程)?
答案 0 :(得分:35)
第一个听起来不错:
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]);
});
答案 1 :(得分:11)
如果你决定使用正则表达式,请确保它像这样阻止rockin'正则表达式:
var result = {};
s.replace(/([^=|]+)=([^|]*)/g, function(noStep3, a, b) { result[a] = b; });
答案 2 :(得分: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]}};
}, {})
答案 3 :(得分:0)
我只是使用正则表达式对每个KEY=VALUE
对进行分组(参见here),然后迭代它们以填充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
}
答案 4 :(得分: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);
});
答案 5 :(得分: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;
}
`