В JavaScript строки запроса к объекту преобразования


Приведенный ниже код преобразует окно.расположение.поиск строки запроса в объект JavaScript. В частности, если ключ встречается более чем один раз полученное значение в объект будет массив. Пожалуйста, не стесняйтесь комментировать, как удобочитаемость и скорость исполнения. Спасибо!

window.location.search.split(/[?&]/g).reduce(function (prev, cur, idx, arr) {
    var segment = cur.split("="),
        key = segment[0],
        val = segment[1];
    if (prev[key]) {
        if (prev[key] instanceof Array) {
            prev[key].push(val);
        } else {
            prev[key] = [prev[key], val];
        }
    } else {
        prev[key] = val;
    }
    return prev;
}, { });


997
2
задан 15 ноября 2011 в 05:11 Источник Поделиться
Комментарии
2 ответа

Линии если (typeof на пред[ключ] === typeof на []) { это... странно. Если ты проверяешь на типа специально, проверить на это: если (typeof на пред[ключ] === 'объект') { - путь вы делаете это есть причины новый литерал массива, который инстанцируют напрасно, а также лишним typeof на работу, как неэффективным, так и откровенно ненужное.

Сделать массив из повторяющихся ключей является ошибочным - если ключ в точности повторяется в строке запроса, только самый правый экземпляр, что значение строки запроса будут получены сервером. Кроме того, в случаях, когда строка запроса содержит достоверно структурированных массивах (тест=1&test2 на[]=2&test2 на[]=4), Ваш код заканчивается с ключом, как проверить[], который является неприятный для доступа: результаты['test2 на[]'] это единственный способ сделать это (без точек синтаксиса допускается).


Редактировать
Чтобы уточнить мои замечания о дублировании ключей, я purhaps ошибочно ограничил мои комментарии к Apache(Linux или Windows)/РНР - конечно, других языков и платформ имеют отношение к дискуссии. В языке PHP (как я наиболее знаком), строку запроса тест=1&Тест=2 приведет к:

var_export($_GET);
/* array (
'test' => '2',
) */

... как видите, только правое значение является единственным перешла в сценарий. Путь в PHP ожидает, что повторяющиеся строки запроса ключей с помощью [] в запросе: тест[]=1&Тест[]=2

var_export($_GET);
/*array (
'test' =>
array (
0 => '1',
1 => '2',
),
)*/

Такое поведение является одинаковым для отправки данных на PHP - вы должны использовать имя="поля myfield[]" если несколько полей будут использовать то же имя, в противном случае, только последний пункт в форме с заданным именем будет заполнен в в PHP $_POST, где данные.

Я не создан, чтобы подтвердить поведение этого в АСП (или других языков), однако исследования показали, что мое утверждение все еще в силе: https://stackoverflow.com/questions/6395290/how-may-i-add-integer-list-to-route/6396793#6396793. Пожалуйста, подтвердите, если вы не в состоянии: из того, что я собрал ценности будут переданы в скрипт в виде списка, разделенного запятыми, но сам язык все еще отказывается работать с повторяющимися ключами и требуется обходной путь.

Если вы можете добавить некоторые сведения об обработке дубликатов ключей и в других языках сервере, пожалуйста, не стесняйтесь редактировать этот ответ. Что сказал, Я чувствую, что моя критика этого скрипта обработки дубликатов ключей, стенды, а также вопрос с "пропечатается" (РНР) массивы в строку запроса - результат [тест[]'] противно.

2
ответ дан 15 ноября 2011 в 05:11 Источник Поделиться

.функция reduce() не поддерживается в IE версии < 9. Если кто-то использует это в своей программе, убедитесь, что это не проблема. Это является потенциальным решением проблемы.

1
ответ дан 29 декабря 2011 в 02:12 Источник Поделиться