$ .param () обратная функция в JavaScript / jQuery

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

При использовании нескольких точек выхода во время контроля ввода или распределения ресурсов, я пытаюсь поместить все 'ошибочные выходы' очень явно во главе функции.

И спартанская статья Programming "SSDSLPedia" и единственная функциональная точка выхода статья "Портлендского Репозитория Шаблона Wiki" имеют некоторые проницательные аргументы вокруг этого. Кроме того, конечно, существует это сообщение для рассмотрения.

, Если Вы действительно хотите единственную точку выхода (на каком-либо non-exception-enabled языке), например, для высвобождения средств в одном единственном месте, я нахожу тщательное применение goto, чтобы быть хорошим; посмотрите, например, этот скорее изобретенный пример (сжатый для сохранения экранного агента по операциям с недвижимостью):

int f(int y) {
    int value = -1;
    void *data = NULL;

    if (y < 0)
        goto clean;

    if ((data = malloc(123)) == NULL)
        goto clean;

    /* More code */

    value = 1;
clean:
   free(data);
   return value;
}

Лично мне, в целом, не нравится стрелка, программируя больше, чем мне не нравятся несколько точек выхода, хотя оба полезны, когда применено правильно. Лучшее, конечно, должно структурировать Вашу программу для требования ни одного. Разрушение Вашей функции в несколько блоков обычно помогает:)

, Хотя при выполнении так, я нахожу, что заканчиваю с несколькими точками выхода так или иначе как в этом примере, где некоторая большая функция была разломана на несколько меньших функций:

int g(int y) {
  value = 0;

  if ((value = g0(y, value)) == -1)
    return -1;

  if ((value = g1(y, value)) == -1)
    return -1;

  return g2(y, value);
}

В зависимости от проекта или инструкций по кодированию, большая часть шаблонного кода могла быть заменена макросами. Как примечание стороны, повреждая его вниз этот путь делает функции g0, g1, g2 очень легкими протестировать индивидуально.

, Очевидно, в OO и поддерживающем исключение языке, я не использовал бы операторы "if" как этот (или вообще, если бы я мог бы выйти сухим из воды с мало достаточно усилия), и код был бы намного более простым. И нестреловидный. И большинство незаключительных возвратов, вероятно, было бы исключениями.

Короче говоря;

  • Немного возвратов лучше, чем много возвратов
  • , больше чем один возврат лучше, чем огромные стрелки, и , защитные пункты вообще в порядке.
  • Исключения могли, вероятно, заменить большинство 'защитных пунктов, если это возможно.

119
задан Pang 11 April 2013 в 03:13
поделиться

5 ответов

Вот как вы можете создать новую функцию jQuery:

jQuery.unparam = function (value) {
    var
    // Object that holds names => values.
    params = {},
    // Get query string pieces (separated by &)
    pieces = value.split('&'),
    // Temporary variables used in loop.
    pair, i, l;

    // Loop through query string pieces and assign params.
    for (i = 0, l = pieces.length; i < l; i++) {
        pair = pieces[i].split('=', 2);
        // Repeated parameters with the same name are overwritten. Parameters
        // with no value get set to boolean true.
        params[decodeURIComponent(pair[0])] = (pair.length == 2 ?
            decodeURIComponent(pair[1].replace(/\+/g, ' ')) : true);
    }

    return params;
};
6
ответ дан 24 November 2019 в 01:51
поделиться

This is a slightly modified version of a function I wrote a while ago to do something similar.

var QueryStringToHash = function QueryStringToHash  (query) {
  var query_string = {};
  var vars = query.split("&");
  for (var i=0;i<vars.length;i++) {
    var pair = vars[i].split("=");
    pair[0] = decodeURIComponent(pair[0]);
    pair[1] = decodeURIComponent(pair[1]);
        // If first entry with this name
    if (typeof query_string[pair[0]] === "undefined") {
      query_string[pair[0]] = pair[1];
        // If second entry with this name
    } else if (typeof query_string[pair[0]] === "string") {
      var arr = [ query_string[pair[0]], pair[1] ];
      query_string[pair[0]] = arr;
        // If third or later entry with this name
    } else {
      query_string[pair[0]].push(pair[1]);
    }
  } 
  return query_string;
};
31
ответ дан 24 November 2019 в 01:51
поделиться

Спасибо ему http://james.padolsey.com/javascript/parsing-urls-with-the-dom/

Довольно просто :D

function params_unserialize(p){
var ret = {},
    seg = p.replace(/^\?/,'').split('&'),
    len = seg.length, i = 0, s;
for (;i<len;i++) {
    if (!seg[i]) { continue; }
    s = seg[i].split('=');
    ret[s[0]] = s[1];
}
return ret;}
6
ответ дан 24 November 2019 в 01:51
поделиться

Вот моя реализация JavaScript, которую я использую в серверной JScript ASP Classic странице (demo):

// Transforms a query string in the form x[y][0][z][]=1 into {x:{y:[{z:[1]}]}}
function parseJQueryParams(p) {
    var params = {};
    var pairs = p.split('&');
    for (var i=0; i<pairs.length; i++) {
        var pair = pairs[i].split('=');
        var indices = [];
        var name = decodeURIComponent(pair[0]),
            value = decodeURIComponent(pair[1]);

        var name = name.replace(/\[([^\]]*)\]/g, 
            function(k, idx) { indices.push(idx); return ""; });

        indices.unshift(name);
        var o = params;

        for (var j=0; j<indices.length-1; j++) {
            var idx = indices[j];
            var nextIdx = indices[j+1];
            if (!o[idx]) {
                if ((nextIdx == "") || (/^[0-9]+$/.test(nextIdx)))
                    o[idx] = [];
                else
                    o[idx] = {};
            }
            o = o[idx];
        }

        idx = indices[indices.length-1];
        if (idx == "") {
            o.push(value);
        }
        else {
            o[idx] = value;
        }
    }
    return params;
}
4
ответ дан 24 November 2019 в 01:51
поделиться

Я использую ответ Дэвида Дорварда и понял, что он ведет себя не так, как PHP или Ruby on Rails, когда они разбирают параметры:

1) переменная является массивом только если она заканчивается на [], например ?choice[]=1&choice[]=12, а не когда она ? a=1&a=2

2) когда существует несколько пар с одинаковым именем, более поздние заменяют более ранние, как на серверах PHP (Ruby on Rails сохраняет первый и игнорирует более поздние), например ?a=1&b=2&a=3

Таким образом, модифицируя версию Дэвида, я имею:

function QueryStringToHash(query) {

  if (query == '') return null;

  var hash = {};

  var vars = query.split("&");

  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var k = decodeURIComponent(pair[0]);
    var v = decodeURIComponent(pair[1]);

    // If it is the first entry with this name
    if (typeof hash[k] === "undefined") {

      if (k.substr(k.length-2) != '[]')  // not end with []. cannot use negative index as IE doesn't understand it
        hash[k] = v;
      else
        hash[k.substr(0, k.length-2)] = [v];

    // If subsequent entry with this name and not array
    } else if (typeof hash[k] === "string") {
      hash[k] = v;  // replace it

    // If subsequent entry with this name and is array
    } else {
      hash[k.substr(0, k.length-2)].push(v);
    }
  } 
  return hash;
};

которая проверена достаточно тщательно.

9
ответ дан 24 November 2019 в 01:51
поделиться
Другие вопросы по тегам:

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