Каков наилучший способ конвертировать строку cookie в объект [duplicate]

Добавление ответа Мэтта для нескольких хостов.

пример ввода будет 192.0.2.10,192.0.2.11

- hosts: localhost
  gather_facts: no
  vars_prompt:
  - name: target_host
    prompt: please enter the target host IP
    private: no
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: dynamically_created_hosts
      with_items: "{{ target_host.split(',') }}"


- hosts: dynamically_created_hosts
  tasks:
  - debug: msg="do things on target host here"
6
задан nyuszika7h 19 February 2011 в 09:22
поделиться

9 ответов

Почему именно вам нужно 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 Пример , чтобы убедить вас.

8
ответ дан Nikita Rybak 21 August 2018 в 19:51
поделиться
  • 1
    Это создает ['foo=bar', 'baz=quux'], но мне нужен объект . – nyuszika7h 18 February 2011 в 23:48
  • 2
    @ Nyuszika7H Нет, это создает объект, а не массив. Вы не можете сделать result['foo'] в массиве. – Nikita Rybak 18 February 2011 в 23:49
  • 3
  • 4
    К сожалению, я не видел, что объект находится в переменной result. Благодаря! – nyuszika7h 18 February 2011 в 23:53
  • 5
    Обратите внимание, что это не произойдет, если какой-либо из «куки» содержать разделитель файлов cookie; это, вероятно, не проблема, но может быть, если вы используете файлы cookie для более сложных данных (например, в stackoverflow.com/questions/10119057 ). – ShadSterling 29 June 2016 в 14:49

Для массива a, содержащего вашу промежуточную форму:

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

, а затем просто:

var obj = {};
for (var i = 0; i < a.length; ++i) {
   var tmp = a[i];
   obj[tmp[0]] = tmp[1];
}
2
ответ дан Alnitak 21 August 2018 в 19:51
поделиться
  • 1
    Это не совсем правильно, производит {'foo,bar': ['baz', 'quux']}. – nyuszika7h 18 February 2011 в 23:51
  • 2
    исправлено - я забыл использовать tmp вместо a в последней строке. – Alnitak 18 February 2011 в 23:52

Я поклонник метода Джона Ресига «Поиск и не заменяю» для этого типа:

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/

1
ответ дан Andy E 21 August 2018 в 19:51
поделиться
0
ответ дан Chad Scira 21 August 2018 в 19:51
поделиться

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

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
ответ дан ircmaxell 21 August 2018 в 19:51
поделиться

анализирует файлы cookie в одной строке (IE9 +):

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

0
ответ дан Joseph Merdrignac 21 August 2018 в 19:51
поделиться

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

function stringToObject(str, delimiter) {
    var result = {};
    if (str && str.length > 0) {
        str = str.split(delimiter || ',');
        for (var i = 0; i < str.length; i++) {
            var cur = str[i].split('=');
            result[cur[0]] = cur[1];
        }
    }
    return result;
}
0
ответ дан Neil Monroe 21 August 2018 в 19:51
поделиться

Самый короткий путь

 document.cookie.split('; ').reduce((prev, current) => {
    const [name, value] = current.split('=');
    prev[name] = value;
    return prev
  }, {});
2
ответ дан Nikita Smith 21 August 2018 в 19:51
поделиться
3
ответ дан sebilasse 21 August 2018 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: