Вопрос по javascript, jquery, url – Преобразовать объект JavaScript в параметры URL

31

Я понимаю, что в принципе я, вероятно, иду по этому пути неправильно, поэтому я открыт для любых толчков в правильном направлении.

Я пытаюсь использовать HipChat API для отправки уведомления в комнату, например так:

https://www.hipchat.com/docs/api/method/rooms/message

Я пытаюсь построить URL в примере с параметрами объекта js, поэтому в основном я пытаюсь преобразовать это:

var hipChatSettings = {
            format:"json",
            auth_token:token,
            room_id: 1,
            from: "Notifications",
            message: "Message"
        }

К этому:

https://api.hipchat.com/v1/rooms/message?format=json&auth_token=token&room_id=1&from=Notifications&message=Message

Ваш Ответ

5   ответов
-7

попробуйте этот метод:

 public static SerializeParams<T>(Datos: T): string {
            var keys = Object.keys(Datos);
            var stringParams: string = "?";
            for (var i in keys) {
                var name = keys[i];
                if (i == 0)
                    stringParams += name + "=" + JSON.stringify(Datos[name]);
                else
                    stringParams += "&" + name + "=" + JSON.stringify(Datos[name])
            }
            return stringParams;
        };
Ваша подпись метода не похожа на JavaScript? Bergi
11

Нечто подобное может работать на вас

var str = "?" + Object.keys(hipChatSettings).map(function(prop) {
  return [prop, hipChatSettings[prop]].map(encodeURIComponent).join("=");
}).join("&");

// "?format=json&auth_token=token&room_id=1&from=Notifications&message=Message"

Если вы не можете зависеть от ECMAScript 5, вы можете использовать простой цикл for

var pairs = [];

for (var prop in hipChatSettings) {
  if (hipChatSettings.hasOwnProperty(prop)) {
    var k = encodeURIComponent(prop),
        v = encodeURIComponent(hipChatSettings[prop]);
    pairs.push( k + "=" + v);
  }
}

var str = "?" + pairs.join("&");
Мне нравится этот ответ. Для ES6 вы можете настроить немного дальшеfunction makeParams(params) => { return params ? '?' + Object.keys(params).map((key) => ([key, params[key]].map(encodeURIComponent).join("="))).join("&") : '' } который вы можете просто добавить на свой путь,path + makeParams(params) и он обрабатывает неопределенные, нулевые и{} jlyonsmith
0

encodeURI (getUrlString ({a: 1, b: [true, 12.3, "string"]}))

getUrlString (params, keys = [], isArray = false) {
  const p = Object.keys(params).map(key => {
    let val = params[key]

    if ("[object Object]" === Object.prototype.toString.call(val) || Array.isArray(val)) {
      if (Array.isArray(params)) {
        keys.push("")
      } else {
        keys.push(key)
      }
      return getUrlString(val, keys, Array.isArray(val))
    } else {
      let tKey = key

      if (keys.length > 0) {
        const tKeys = isArray ? keys : [...keys, key]
        tKey = tKeys.reduce((str, k) => { return "" === str ? k : `${str}[${k}]` }, "")
      }
      if (isArray) {
        return `${ tKey }[]=${ val }`
      } else {
        return `${ tKey }=${ val }`
      }

    }
  }).join('&')

  keys.pop()
  return p
}
42

функция jQuery.param.

var params = { width:1680, height:1050 };
var str = jQuery.param( params );
console.log(str);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

(Я должен был сказать, что использую jQuery, но вы, очевидно, читаете мои мысли) :) user2865446
Он не читал твои мысли. Просто при переполнении стека, когда вы спрашиваете что-то о JavaScript, вы получите девяносто ответов jQuery, даже если вы прямо скажете, что не хотите ответов jQuery. Помните об этом в будущем, когда вы захотите получить ответ на jQuery JavaScript. ;) L0j1k
@ L0j1k Вы правы, но ответы jQuery могут быть полезны для других людей, приходящих сюда из Google, даже если они бесполезны для OP. Поэтому я считаю, что это хорошая мода. Vadim Ovchinnikov
36
Object.keys(hipChatSettings).map(function(k) {
    return encodeURIComponent(k) + "=" + encodeURIComponent(hipChatSettings[k]);
}).join('&')
// => "format=json&auth_token=token&room_id=1&from=Notifications&message=Message"

обновленный JavaScript. Если вы хотите, чтобы это работало на древних, подгоните или переписайте вfor.

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