Intereting Posts
Как получить экземпляр db из родного драйвера node-mongo? Почему код продолжает работать даже после «return res.send (); connect: multipart: использовать парсер (многопартийный, busboy, грозный) Node.js + socket.io: приложение на сервере работает неправильно Экспресс: доступ к настройкам app.set () в маршрутах Как использовать внешние библиотеки в grafana datasource-plugin mac проверить сбой с помощью узла с сертификатом ssl Узел последовательного порта в качестве внешнего модуля в webpack – модуль не найден Функция повторного использования внутри нефрита Как ограничить скорость загрузки с сервера в node.js? Module.exports vs plain json для файлов конфигурации Как я могу заменить значок favicon по умолчанию в созданном web-пакете loopc loopback? Как использовать child_process в webpack Можно ли программно запустить приложение Тест производительности в веб-браузере? Невозможно передать сообщение после добавления ssl поверх socket.io

Разделить пару ключей и значений, разделенных символом, разделенных символом ‘=’

Мы получаем значение входного параметра в виде пары ключ-значение, разделенной по каналам, разделенной символами = . Например:

 "|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 с | и снова на каждом элементе, разделенном на = .
  • Я могу зависеть от регулярного выражения и заменить строку.
  • Разделить его с = удалить трейлинг | символа и связывать два разных массива с индексами.

Может ли кто-нибудь сказать мне лучший / самый эффективный способ сделать это в JavaScript (программирование в Node.js)?

Первый звучит хорошо:

 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]); }); 

Если вы решите использовать регулярное выражение, убедитесь, что это ключевое слово blockin ‘regex:

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

регулярная железная дорога

Без мутации

Вам не нужны внешние трубы. Если необходимо, str.slice(1, str.length - 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]}}; }, {}) 
 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); }); 

Я бы просто использовал регулярные выражения, чтобы группировать (см. Здесь ) каждую пару 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 } 

Самый чистый способ, вы можете изменить источник для разделения на другой разделитель.

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