Учитывая следующую форму:
<form>
<input name="foo" value="bar">
<input name="hello" value="hello world">
</form>
Я могу использовать $.param( .. )
конструкцию для сериализации формы:
$.param( $('form input') )
=> foo=bar&hello=hello+world
Как я могу десериализовать указанную выше строку с помощью JavaScript и получить обратно хэш?
Например,
$.magicFunction("foo=bar&hello=hello+world")
=> {'foo' : 'bar', 'hello' : 'hello world'}
Ссылка: jQuery.param( obj )
.
javascript
jquery
СЕБ
источник
источник
+
. Теперь он заменяет их все!QueryString
. Я сделал один, но он не принимает параметры, он только читает из window.location.search. Я помню других, которые принимают параметры ...Ответы:
Вы должны использовать JQuery BBQ «s deparam функцию. Это хорошо протестировано и задокументировано.
источник
Это немного измененная версия функции, которую я написал недавно, чтобы сделать что-то подобное.
источник
Как насчет этого краткого функционального подхода?
Пример:
источник
field[][]=a&field[0][]=b&field[0][]=c
обрабатывается так, какObject { field[][]: "a", field[0][]: "c" }
долженresultobject.field[0] = Array [ "a", "b", "c" ]
. Это поведение, ожидаемое от PHP. Решение @ JackyLi позаботится об этом.Мой ответ:
источник
JSON.stringify(geturlargs('fld[2][]=2&fld[][]=3&fld[3][]=4&fld[]=bb&fld[]=cc').fld)
я получаю{"2":["2"],"3":["4"],"":"cc"}
не[null,null,[2],[3,4],"bb","cc"]
то, на что надеялся (это то, что мне дал PHP).Я использую ответ Дэвида Дорварда и понял, что он не ведет себя как PHP или Ruby on Rails, как они анализируют параметры:
1) переменная является массивом, только если она заканчивается
[]
, например?choice[]=1&choice[]=12
, not, когда она?a=1&a=2
2) когда существует несколько параметров с тем же именем, более поздние заменяют более ранние, как на серверах PHP (Ruby on Rails сохраняет первый и игнорирует более поздние), например
?a=1&b=2&a=3
Итак, изменяя версию Дэвида, у меня есть:
который протестирован достаточно тщательно.
источник
hash[k.substr(0, k.length-2)] = [v];
иhash[k.substr(0, k.length-2)].push(v);
Я знаю, что это старая ветка, но, может быть, она все еще актуальна?
Вдохновленный хорошим решением Джеки Ли, я попробовал небольшое собственное изменение, чтобы также иметь возможность обрабатывать произвольные комбинации массивов и объектов в качестве входных данных. Я посмотрел, как PHP мог бы это сделать, и попытался добиться чего-то «похожего». Вот мой код:
Если функция вызывается без
str
аргумента -аргумента, она будет считатьсяwindow.location.search.slice(1)
входной.Некоторые примеры:
приводит к
В то время как решение Джеки Ли позволило бы создать внешний контейнер для
a
как простой объект.getargs()
смотрит на первый заданный индекс для любого уровня, чтобы определить, будет ли этот уровень объектом (нечисловым индексом) или массивом (числовым или пустым), в результате чего будет получен результат, как показано в листинге bove (№ 6).Если текущий объект является массивом, то
null
s вставляются везде, где необходимо, для представления пустых позиций. Массивы всегда нумеруются последовательно и отсчитываются от нуля).Обратите внимание, что в примере нет. 8 «автоинкремент» для пустых индексов по-прежнему работает, хотя сейчас мы имеем дело с объектом, а не массивом.
Насколько я тестировал, мой
getargs()
ведет себя почти так же, как отличный$.deparam()
плагин jQuery Крисса Роджера, упомянутый в принятом ответе. Основное отличие заключается в том, что онgetargs
работает без jQuery и выполняет автоинкремент в объектах, в то время как$.deparam()
этого не происходит:приводит к
В
$.deparam()
индексе[]
интерпретируется какundefined
вместо автоматически увеличивающегося числового индекса.источник
o[k]=isNaN(idx[0])?{}:[];
с намерением создать массив всякий раз, когда я встречаю числовой индекс в качестве первого, заданного для нового объекта. В противном случае я сделаю общий объект. Вы можете изменить эту часть кода в соответствии со своими потребностями. I. e. что-то вродеo[k]={}
должно сработать.Вот как можно создать новую функцию jQuery:
источник
true
так, чтобы можно было проверитьif (params.redirect)
или подобное. Если вы хотите различатьtrue
и другое значение, вы должны использоватьif (params.redirect === true)
.null
Значение не помогло бы в любом случае , что я могу думать. Причина, по которой я не делал этого, как Дэвид, заключается в том, что я ценю последовательность выше гибкости. С его методом я должен проверить, является ли значение строкой или массивом, чтобы использовать его значение. На мой взгляд, это всегда должна быть строка (true
значение преобразуется в то,'true'
что я считаю нормальным) или всегда массив. Я выбрал струну./abc?delete
то я ожидаю, что будет запись дляdelete
. Я не понимаю, чем это отличается? Я даже не понимаю, как вы можете предпочесть другой код по этой причине, потому что этот код установит значение для строки,'undefined'
которая не лучше. А что касается нескольких значений, это случай простоты и гибкости. Я редко вижу использование нескольких значений в строках запроса, но если они вам нужны, всегда возвращайте массив со значениями 1+. Никогда не смешивайте возвращаемый тип; то вам будет нужно тратить время на отладку , потому , что, как правило , строка может внезапно быть массивом.Благодаря ему http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
Довольно просто: D
источник
?something=1¶m2=value2
массиву. Что вы имеете в виду под «не работать с полями выбора с несколькими вариантами»?Вот моя реализация JavaScript, которую я использую на странице JScript ASP Classic на стороне сервера ( демонстрация ):
источник
использовать это :
источник
Я придумал это решение, которое ведет себя как функция .Net
HttpUtility.ParseQueryString
.В результате параметры строки запроса сохраняются в свойствах как списки значений, так что
qsObj["param"]
это будет то же самое, что и вызовGetValues("param")
в .Net.Я надеюсь тебе это понравится. JQuery не требуется.
Вот как им пользоваться:
Чтобы просмотреть результат в консоли, введите:
Вывод:
источник
На CSS-Tricks есть красивый однострочный текст (исходный код от Николаса Ортенцио ):
По-настоящему умно то, как он использует
this
объект анонимной функции , добавляя пару ключ / значение для каждого запроса в строке. Тем не менее, есть возможности для улучшения. Я изменил его немного ниже, со следующими изменениями:Добавлена обработка пустых строк и нестрокового ввода.
Обработанные строки в кодировке URI (
%40
->@
и т. Д.).Удалено использование по умолчанию,
document.location.search
когда вход был пуст.Изменили название, сделали более читабельным, добавили комментарии.
источник
Это действительно старый вопрос, но раз уж я пришел - другие люди могут прийти к этому сообщению, и я хочу немного обновить эту тему. Сегодня нет необходимости делать нестандартные решения - есть интерфейс URLSearchParams .
Единственное известное мне ограничение - эта функция не поддерживается в IE / Edge.
источник
Это моя версия в Coffeescript. Также работает для URL, например
http://localhost:4567/index.html?hello=[%22world%22]&world=hello#/home
источник
Вот простой и компактный вариант, если вы хотите быстро получить параметры только из запроса GET:
Он преобразует
в объект вроде
источник
Создает сериализованное представление массива или объекта (может использоваться как строка запроса URL для запросов AJAX).
источник
ответы могут использовать немного элегантности jQuery :
вилка на https://gist.github.com/956897
источник
Вы можете использовать функцию
.serializeArray()
( Link ) самого jQuery. Эта функция возвращает массив пары ключ-значение. Пример результата:источник