2013-04-27 4 views
9

Otrzymujemy wartość parametru wejściowego jako oddzieloną od rur parą klucz-wartość, oddzieloną symbolami =. Na przykład:Podziel rozdzielaną rurą parę klucz-wartość oddzieloną symbolem "="

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

Więc format: |KEY=VALUE|KEY_2=VALUE_2|....|KEY_n=VALUE_n|

muszę podzielić ją na obiekt JSON. Tak, mój obiekt powinien być:

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

Co będzie najlepszym sposobem, ponieważ istnieje wiele opcji:

  • mogę użyć split z | i ponownie na każdym ułamku elementu z =.
  • Mogę polegać na wyrażeniu regularnym i zastępowaniu ciągu.
  • Podziel go za pomocą = usuń końcowy znak | i skojarz dwa różne tablice z indeksami.

Czy ktoś może mi powiedzieć najlepszy/najbardziej efektywny sposób robienia tego w JavaScript (programowanie w Node.js)?

+1

Podział na '|' '=' potem. Jest prosty i wydajny. W razie potrzeby trymuj wiodące i końcowe "|". – mpen

Odpowiedz

31

Pierwszy z nich brzmi dobrze:

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

Chciałbym po prostu użyć wyrażeń regularnych do grupy (patrz here) każdego KEY=VALUE pary i następnie iteracyjne nad nimi, aby wypełnić obiekt JSON. Więc można mieć coś takiego:

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

Jeśli zdecydujesz się użyć wyrażenia regularnego, upewnić się, że blok Rockin' regex tak:

var result = {}; 

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

regex railroad

+0

Odpowiedź nr 1, ale nie ma potrzeby przechwytywania '=', po prostu: 'replace (/ ([^ | = = +) = ([^ |] +)/g, funkcja (_, x, y) {obj [x] = y}) ' – georg

+0

@ thg435 prawda, którą jesteś - jakże cholernie mnie! Ja zaktualizowałem... –

0

najczystszym sposobem możliwe, możesz zmodyfikować źródło, aby podzielić je za pomocą innego ogranicznika.

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; 
} 
`