Преобразование строк, таких как document.cookie, в объекты - PullRequest
8 голосов
/ 19 февраля 2011

У меня есть строка, похожая на document.cookie:

var str = 'foo=bar, baz=quux';

Преобразовать его в массив очень просто:

str = str.split(', ');
for (var i = 0; i < str.length; i++) {
    str[i].split('=');
}

Он производит что-то вроде этого:

[['foo', 'bar'], ['baz', 'quux']]

Конвертировать в объект (что было бы более уместно в этом случае) сложнее.

str = JSON.parse('{' + str.replace('=', ':') + '}');

Создает такой объект, который недопустим:

{foo: bar, baz: quux}

Я хочу такой объект:

{'foo': 'bar', 'baz': 'quux'}

Примечание : в своих примерах я использовал одинарные кавычки, но при публикации вашего кода, если вы используете JSON.parse(), помните, что для него нужны двойные кавычки вместо одинарных.


Обновление

Спасибо всем. Вот функция, которую я буду использовать (для дальнейшего использования):

function str_obj(str) {
    str = str.split(', ');
    var result = {};
    for (var i = 0; i < str.length; i++) {
        var cur = str[i].split('=');
        result[cur[0]] = cur[1];
    }
    return result;
}

Ответы [ 9 ]

8 голосов
/ 19 февраля 2011

Почему именно вам нужно JSON.parse здесь?Пример изменения ваших массивов

str = str.split(', ');
var result = {};
for (var i = 0; i < str.length; i++) {
    var cur = str[i].split('=');
    result[cur[0]] = cur[1];
}

edit
Пример , чтобы убедить вас.

4 голосов
/ 21 мая 2018

Кратчайший путь

 document.cookie.split('; ').reduce((prev, current) => {
    const [name, value] = current.split('=');
    prev[name] = value;
    return prev
  }, {});
4 голосов
/ 03 марта 2017

примечание: document.cookie (заголовок вопроса) разделяется точкой с запятой и не разделяется запятой (вопрос) ...

Альтернативный вариант использования reduce:

var str = 'foo=bar; baz=quux';
var obj = str.split(/[;] */).reduce(function(result, pairStr) {
  var arr = pairStr.split('=');
  if (arr.length === 2) { result[arr[0]] = arr[1]; }
  return result;
}, {});
2 голосов
/ 19 февраля 2011

Чтобы преобразовать его в объект, просто сделайте это с самого начала:

var obj = {};
str = str.split(', ');
for (var i = 0; i < str.length; i++) {
    var tmp = str[i].split('=');
    obj[tmp[0]] = tmp[1];
}

Тогда, если вы хотите JSON из этого:

var jsonString = JSON.stringify(obj);
2 голосов
/ 19 февраля 2011

Учитывая массив a, содержащий вашу промежуточную форму:

[['foo', 'bar'], ['baz', 'quux']]

тогда просто:

var obj = {};
for (var i = 0; i < a.length; ++i) {
   var tmp = a[i];
   obj[tmp[0]] = tmp[1];
}
1 голос
/ 19 февраля 2011

Я фанат метода Джона Ресига "Поиск и не замени" для такого рода вещей:

var str = 'foo=bar, baz=quux',
    arr = [],
    res = '{';

str.replace(/([^\s,=]+)=([^,]+)(?=,|$)/g, function ($0, key, value) { 
    arr.push('"' + key + '":"' + value + '"');
});

res += arr.join(",") + "}";

alert(res);

Рабочий пример: http://jsfiddle.net/cm6MT/.

Упрощает работу без поддержки JSON.Конечно, с тем же самым регулярным выражением также просто использовать exec() или match().

Ой, я думал, что вы хотите преобразовать в строку JSON, а не в объект.В этом случае вам нужно лишь немного изменить код:

var str = 'foo=bar, baz=quux',
    res = {};

str.replace(/([^\s,=]+)=([^,]+)(?=,|$)/g, function ($0, key, value) { 
    res[key] = value;
});
console.log(res.foo);
//-> "bar"

Рабочий пример 2: http://jsfiddle.net/cm6MT/1/

0 голосов
/ 24 апреля 2017

разбирать куки в одной строке (IE9 +):

document.cookie.split('; ').reduce(function(result, v, i, a) { var k = v.split('='); result[k[0]] = k[1]; return result; }, {})

0 голосов
/ 04 февраля 2016

Альтернативная версия вашего обновленного решения, которая проверяет нулевую / пустую строку и просто возвращает пустой объект, а также позволяет использовать собственные разделители.

0 голосов
/ 19 февраля 2011

Это довольно дрянные данные, если их не использовать, = это будет работать с этими данными

var text = 'foo=bar, baz=quux',
    pattern = new RegExp(/\b([^=,]+)=([^=,]+)\b/g),
    obj = {};

while (match = pattern.exec(text)) obj[match[1]] = match[2];

console.dir(obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...