Функция JavaScript для преобразования объекта значения ключа JSON в строку запроса - PullRequest
4 голосов
/ 14 февраля 2011

Я работаю над форматированием URL для Диалога Facebook Feed .Там так много параметров, хотя.Я хочу иметь функцию для этих диалогов, что-то вроде:

function generateDialogUrl(dialog, params) {
  base  = "http://www.facebook.com/dialog/" + dialog + "?";
  tail = [];
  for (var p in params) {
    if (params.hasOwnProperty(p)) {
      tail.push(p + "=" + escape(params[p]));
    }
  }
  return base + tail.join("&")
}

Ого ... Думаю, я только что ответил на свой вопрос.Это правильно?Является ли escape() правильной функцией для использования?

Я застрял в исходном коде Lovers .

ОБНОВЛЕНИЕ: Поскольку мы используем jQuery, я переписалметод с использованием jQuery.each.Я также заменил escape() на encodeURIComponent(), как предложено @galambalazs & @TJ Crowder.Спасибо, ребята!

var generateDialogUrl = function (dialog, params) {
  base  = "http://www.facebook.com/dialog/" + dialog + "?";
  tail = [];
  $.each(params, function(key, value) {
    tail.push(key + "=" + encodeURIComponent(value));
  })
  return base + tail.join("&");
}

Работает!

Ответы [ 4 ]

7 голосов
/ 14 февраля 2011

Еще лучше, используйте encodeURIComponent.См. Эту статью , в которой сравниваются два:

Метод escape () не кодирует символ +, который интерпретируется как пробел на стороне сервера кака также генерируется формами с пробелами в своих полях.Из-за этого недостатка и того факта, что эта функция не может правильно обрабатывать символы, не входящие в ASCII, вы должны избегать использования escape (), когда это возможно.Лучшая альтернатива обычно encodeURIComponent () .

escape () не будет кодировать: @ * / +

2 голосов
/ 10 февраля 2015

Для этого есть метод jQuery: $. Param .Это будет работать так:

var generateDialogUrl = function (dialog, params) {
  base = 'http://www.facebook.com/dialog/' + dialog + '?';
  return base + $.param(params);
}
0 голосов
/ 06 мая 2019
const createQueryParams = (param, prefix = '') => {
    let queryString = '';
    if (param.constructor === Object) {
        queryString = Object.keys(param).reduce((result, key) => {
            const obj = param[key];
            const queryParam = result ? `${result}&${prefix}` : prefix;
            if (obj.constructor === Object) {
                return `${queryParam}${createQueryParams(obj, `${key}.`)}`;
            } else if(obj.constructor === Array) {
                const qp= obj.map((item, index)=> {
                    if (item.constructor === Object || item.constructor === Array) {
                        const query = createQueryParams(item, `${key}[${index}].`);
                        return `${query}`;
                    } else {
                        return `${key}[${index}]=${item}`;
                    }
                }).reduce((res, cur) => {
                    return res ? `${res}&${cur}`: `${cur}`;
                }, '');

                return `${queryParam}${qp}`;
            } else {
                return `${queryParam}${key}=${obj}`;
            }
        }, '');
    } else if(param.constructor === Array) {
        queryString = param.reduce((res, cur) => `${res},${cur}`);
    } else {
        queryString = param;
    }

    return encodeURI(queryString);
};

Пример:

createQueryParams({"Context":{"countryCode":"NO"},"Pagination":{"limit":10,"offset":1},"AdditionalField":[{"name":"Policy Number","value":"Pol123"},{"name":"Policy Version","value":"PV1"}]});
0 голосов
/ 09 января 2017
convertJsonToQueryString: function (json, prefix) {
    //convertJsonToQueryString({ Name: 1, Children: [{ Age: 1 }, { Age: 2, Hoobbie: "eat" }], Info: { Age: 1, Height: 80 } })
    if (!json) return null;
    var str = "";
    for (var key in json) {
        var val = json[key];
        if (isJson(val)) {
            str += convertJsonToQueryString(val, ((prefix || key) + "."));
        } else if (typeof (val) == "object" && ("length" in val)) {
            for (var i = 0; i < val.length; i++) {
                //debugger
                str += convertJsonToQueryString(val[i], ((prefix || key) + "[" + i + "]."));
            }
        }
        else {
            str += "&" + ((prefix || "") + key) + "=" + val;
        }
    }
    return str ? str.substring(1) : str;
}

isJson = function (obj) {
    return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && !obj.length;
};

пример:

convertJsonToQueryString({Name:1,Children:[{Age:1},{Age:2,Hoobbie:"eat"}],Info:{Age:1,Height:80}})

Результат:

"Name=1Children[0].Age=1Children[1].Age=2&Children[1].Hoobbie=eatInfo.Age=1&Info.Height=80"
...