Bir Javascript Nesnesinin sorgu dizesi kodlaması


481

stringBir GETistek yoluyla iletebileceğim bir Javascript nesnesini kodlamak için hızlı ve basit bir yol biliyor musunuz ?

Hayır jQuery, başka çerçeve yok - sadece düz Javascript :)


Çözümünüz için uygun bir çözüm varsa neden JQuery çözüm olamaz?
eaglei22

@ eaglei22 çünkü o sırada bir IPTV set üstü cihaz için bir proje üzerinde çalışıyordum ve harici kütüphanelere izin verilmedi. ;-)
napolux 31:17

1
Yanıt için teşekkürler. Bu spesifikasyonu zaman zaman görüyorum ve her zaman bunun nedenini merak ettim. Şimdi bir tane aldım, teşekkürler! :)
eaglei22

9
@ eaglei22 Çünkü bazen bir öğeyi kimliğe göre almak için büyük bir kütüphane yüklemek istemezsiniz.
Aaron Harun

çoğu tarayıcı URLSearchParamsşu anda destekliyor ...
mb21

Yanıtlar:


810

bunun gibi?

serialize = function(obj) {
  var str = [];
  for (var p in obj)
    if (obj.hasOwnProperty(p)) {
      str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
    }
  return str.join("&");
}

console.log(serialize({
  foo: "hi there",
  bar: "100%"
}));
// foo=hi%20there&bar=100%25

Düzenleme: bu da özyinelemeli nesneleri dönüştürür (sorgu dizesi için php "dizi" gösterimi kullanarak)

serialize = function(obj, prefix) {
  var str = [],
    p;
  for (p in obj) {
    if (obj.hasOwnProperty(p)) {
      var k = prefix ? prefix + "[" + p + "]" : p,
        v = obj[p];
      str.push((v !== null && typeof v === "object") ?
        serialize(v, k) :
        encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
  }
  return str.join("&");
}

console.log(serialize({
  foo: "hi there",
  bar: {
    blah: 123,
    quux: [1, 2, 3]
  }
}));
// foo=hi%20there&bar%5Bblah%5D=123&bar%5Bquux%5D%5B0%5D=1&bar%5Bquux%5D%5B1%5D=2&bar%5Bquux%5D%5B2%5D=3


2
{Foo: [1,2,3], bar: "% 100"} verildiğinde kesilmeyecek mi?
Quentin

1
@Ofri: Onu almak üzere kurulmuş bir sunucuya POST istekleri için JSON iyi bir seçimdir. GET istekleri için, sunucuya birkaç basit parametre dışında bir şey gönderiyorsanız, muhtemelen tasarımınız yanlıştır.
Tim Down

2
@Marcel Çünkü fonksiyon hasOwnProperty'yi kontrol etmez. Kemanınızı
Rudie

1
@TimDown Yorumunuzla ilgili olarak GET isteklerinde basit parametreler gönderme. Katılmıyorum. Parametreleri dizilere gruplamak, sunucu tarafındaki PHP'nin gitmeye hazır bir ilişkisel dizi bulması nedeniyle kullanışlı olabilir. Bunun bir tasarım olarak neden yanlış olduğunu göremiyorum.
Savas Vedova

1
'İf (obj.hasOwnProperty (prop))' gerekli mi? For in döngü döngü nesnenin özellikleri üzerinde sadece böylece hasOwnProperty çağıran her zaman doğru değerlendirir
Arnon

231

jQuery bunun için bir işleve sahiptir jQuery.param(), zaten kullanıyorsanız, bunu kullanabilirsiniz: http://api.jquery.com/jquery.param/

misal:

var params = { width:1680, height:1050 };
var str = jQuery.param( params );

str şimdi içeriyor width=1680&height=1050


119
Napolux'dan (OP) alıntı: "sadece düz Javascript" . : P
Sk8erPeter

6
jQuery.param () uğursuz bir davranışa sahiptir. Var a = []; a = 12; console.log (jQuery.param ({özellik listesi: a})); ne demek istediğimi görmek için.
akond

13
@akond jQuery belgeleri özellikle çıplak bir dizide geçemeyeceğinizi söylüyor.
Ariel

4
@Ariel Çıplak bir diziden geçmiyor. 2564 dizininde yalnızca bir değere sahip bir diziden geçiyor. Göstermek için: var a = []; a[5] = 'foo'; jQuery.param({ parameters: a }); Sonuç olarak "parameters[]=&parameters[]=&parameters[]=&parameters[]=&parameters[]=&parameters[]=foo". Hangi doğru olsa da, beklediğiniz gibi olmayabilir.
Chris Hall

4
Soru sordu Vanilla JS
Bug Hunter 219

189

Sadece kullanmak URLSearchParamsBu mevcut tüm tarayıcılarda işleri

new URLSearchParams(object).toString()

5
Hayır özyinelemeli nesneler yapmaz
Eddie Monge Jr

Yuvalanmış nesne üzerinde çalışmaz. let j = { m: 5, n: { k: 1 } }; new URLSearchParams(j).toString(); // result "m=5&n=%5Bobject+Object%5D"
hitautodestruct

19
@EddieMongeJr Sorgu dizeleri tasarım açısından anahtar / değer çiftleridir, iç içe nesneleri serileştirmek bile istememelisiniz Bu cevap modern yoludur. Upvotes gerekli.
Romain Durand

5
Evet bunlar anahtar değer çiftleridir, ancak değerin dize olarak kodlanmış bir nesne olamayacağını söyleyen hiçbir şey yoktur. Ayrıca, orijinal sorular iç içe özellikleri olabilir bir "Javascript nesnesi bir dize" ister
Eddie Monge Jr

@EddieMongeJr bile kabul edilen cevap (ve kısa bir bakıştan sonra diğerleri) yuvalanmış nesneyi desteklemez. Şunları yapabilirsiniz stringifyiç içe nesneleri yapabilirsiniz önceURLSearchParams
Mosh Feu

128
Object.keys(obj).reduce(function(a,k){a.push(k+'='+encodeURIComponent(obj[k]));return a},[]).join('&')

Düzenleme: Bu tek astarı beğendim, ancak kabul edilen cevabı semantik olarak eşleştirdiyse daha popüler bir cevap olacağını tahmin ediyorum:

function serialize( obj ) {
    let str = '?' + Object.keys(obj).reduce(function(a, k){
        a.push(k + '=' + encodeURIComponent(obj[k]));
        return a;
    }, []).join('&');
    return str;
}

1
İndirgeme fonksiyonu için özel bir hat okunabilirliği büyük ölçüde artıracaktır.
Aurelien Ribon

54
.Reduce () yerine .map () kullanmak daha da kolay olurdu:Object.keys(obj).map(k => k + '=' + encodeURIComponent(obj[k])).join('&')
Jannes

2
Sadece Object.keysIE> = 9
Johnston

5
Birleştirme yerine ES6 şablonları kullanarak @Jannes kodu daha da geliştirildi -Object.keys(obj).map(k => `${k}=${encodeURIComponent(obj[k])}`).join('&')
csilk

1
Anahtarlarınızın encodeUriComponent ❤️'e de ihtiyacı varsa:Object.entries(obj).map(e => e.map(ee => encodeURIComponent(ee)).join('=')).join('&');
Blaise

112

İşte ES6'da bir astar:

Object.keys(obj).map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`).join('&');

w / k anahtarını değiştirdiğinizde
altınsınız

17
Uyarı! Bu sadece sığ nesnelerde çalışır. Başka bir nesne olan üst düzey bir özelliğiniz varsa, bu bir liner "key =% 5Bobject% 20Object% 5D" çıktısını verir. Tıpkı bir başkan gibi.
Andrew Allbright

4
Ayrıca, bu dizileri tükürmez. Ne export?actions[]=finance,create,editzaman export?actions[]=finance&actions[]=create&actions[]=editkorkunç standart olarak olması gerekir var .
darkbluesun

3
Diziler hemen hemen her zaman "tek başınasınız" dır, çünkü URL argümanları spesifikasyon açısından sadece dizelerdir, bu nedenle tek bir dize olmayan bir şeyin sunucu tarafından doğru bir şekilde okunmasını sağlamak için kancatasınız diyorsun. actions[]PHP gösterimidir; Django actionbunun yerine çoklu kullanır ( []sonek yok ); diğer bazı ORM / CMS, virgülle ayrılmış listeler vb. gerektirir. Bu nedenle "basit dizeler değilse, sunucunuzun ne istediğini bildiğinizden emin olun".
Mike 'Pomax' Kamermans

Çok zarif bir çözüm!
Anh Tran


43

URLSearchParamsArayüzü kullanmanızı öneririm :

const searchParams = new URLSearchParams();
const search = {foo: "hi there", bar: "100%" };
Object.keys(search).forEach(key => searchParams.append(key, search[key]));
console.log(searchParams.toString())

Veya arama nesnesini aşağıdaki gibi yapıcıya aktararak:

const obj = {foo: "hi there", bar: "100%" };
const params = new URLSearchParams(obj).toString();

1
İlginç bir öneri, ancak bu özellik için tarayıcı desteğinin hala çok düzensiz olduğunu unutmayın.
mrec

IE'yi (şu anda oldukça yaygın olan) ve bazı belirli mobil sürümleri desteklemeyecekseniz, bu en iyi yanıttır, çünkü düz JavaScripttir.
Marcos Sandrini

24

Kullanıcı tarafından kabul edilen çözümde küçük bir değişiklik187291:

serialize = function(obj) {
   var str = [];
   for(var p in obj){
       if (obj.hasOwnProperty(p)) {
           str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
       }
   }
   return str.join("&");
}

Nesnedeki hasOwnProperty öğesini denetlemek JSLint / JSHint'i mutlu eder ve nesne basit bir sözlükten başka bir şeyse, nesnenin veya diğer şeylerin yöntemlerini yanlışlıkla serileştirmeyi önler. Bu sayfadaki ifadeler için paragrafına bakın: http://javascript.crockford.com/code.html


14

Herkes tek astarını buraya koymuş gibi görünüyor, işte benimki:

const encoded = Object.entries(obj).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join("&");

1
IE'de Object.entries desteklenmez.
MBouwman

@ MBouwman, IE iyi ve kötünün ötesinde kırıldı, bu yüzden babel / core-js
chpio

@chpio Babel / core-js, haklıysam Object.entries'i desteklemez.
MBouwman

core Object.entries desteğine sahiptir: github.com/zloirock/core-js/blob/master/… ve hatta eski corejs2 babel çalışma zamanı dönüşümü de bunu destekliyor github.com/babel/babel/blob/…
chpio

12

Rasgele nesneler göndermeniz mi gerekiyor? Öyleyse, GET kötü bir fikirdir, çünkü kullanıcı aracılarının ve web sunucularının kabul edeceği URL'lerin uzunluk sınırlamaları vardır. Benim önerim göndermek ve sonra bir sorgu dizesi oluşturmak için bir isim-değer çiftleri dizisi oluşturmak olacaktır:

function QueryStringBuilder() {
    var nameValues = [];

    this.add = function(name, value) {
        nameValues.push( {name: name, value: value} );
    };

    this.toQueryString = function() {
        var segments = [], nameValue;
        for (var i = 0, len = nameValues.length; i < len; i++) {
            nameValue = nameValues[i];
            segments[i] = encodeURIComponent(nameValue.name) + "=" + encodeURIComponent(nameValue.value);
        }
        return segments.join("&");
    };
}

var qsb = new QueryStringBuilder();
qsb.add("veg", "cabbage");
qsb.add("vegCount", "5");

alert( qsb.toQueryString() );

11

Raylar / PHP Stil Sorgu Oluşturucu

Bu yöntem, bir Javascript nesnesini bir URI Query String. Ayrıca, iç içe dizileri ve nesneleri (in Rails/ PHPsözdizimi) işler :

function serializeQuery(params, prefix) {
  const query = Object.keys(params).map((key) => {
    const value  = params[key];

    if (params.constructor === Array)
      key = `${prefix}[]`;
    else if (params.constructor === Object)
      key = (prefix ? `${prefix}[${key}]` : key);

    if (typeof value === 'object')
      return serializeQuery(value, key);
    else
      return `${key}=${encodeURIComponent(value)}`;
  });

  return [].concat.apply([], query).join('&');
}

Örnek Kullanım:

let params = {
  a: 100,
  b: 'has spaces',
  c: [1, 2, 3],
  d: { x: 9, y: 8}
}

serializeQuery(params)
// returns 'a=100&b=has%20spaces&c[]=1&c[]=2&c[]=3&d[x]=9&d[y]=8

Güzel bir örnek. Cevabınızdaki bir yazım hatasını düzelttim. Bu arada, değerlerinizi (null, undefined, NaN, '') functionhariç tutmak için düzenlerseniz ilginç olur falsy...
developer033

8

JSON kullanın.

nasıl uygulanacağı hakkında fikir edinmek için bu soruya göz atın .


2
Sunucuyu ne yazdığını bilmiyorum, ama çoğu modern dilde JSON yazan iyi paketler var. Ayrıca, onu uygulasa bile, kendi yeni bir kodlama şemasını icat etmekten daha JSON okuma sunucusu kodu uygulamak daha iyidir. Bunun gibi DIY kodlamaları buggy olma eğilimindedir (çünkü genellikle kendi içinde bir dizi olmak vb. Gibi olası tüm durumları düşünmezsiniz).
Ofri Raviv

temelde teh nesnesini JSON dönüştürmek ve sonra tüm JSON dizesini tek bir GET sorgu parametresi olarak sunucuya geçirmek için öneriyoruz?
Marco Demaio

8

İşte kabul edilen cevabın kahve versiyonu. Bu birine zaman kazandırabilir.

serialize = (obj, prefix) ->
  str = []
  for p, v of obj
    k = if prefix then prefix + "[" + p + "]" else p
    if typeof v == "object"
      str.push(serialize(v, k))
    else
      str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v))

  str.join("&")

Teşekkürler alfonso! Gerçekten zamanımı kurtardım!
Lukas

6

İşte Object.entries ile özlü ve özyinelemeli bir sürüm . Rastgele iç içe dizileri işler, ancak iç içe nesneleri değil. Ayrıca boş öğeleri de kaldırır:

const format = (k,v) => v !== null ? `${k}=${encodeURIComponent(v)}` : ''

const to_qs = (obj) => {
    return [].concat(...Object.entries(obj)
                       .map(([k,v]) => Array.isArray(v) 
                          ? v.map(arr => to_qs({[k]:arr})) 
                          : format(k,v)))
           .filter(x => x)
           .join('&');
}

Örneğin:

let json = { 
    a: [1, 2, 3],
    b: [],              // omit b
    c: 1,
    d: "test&encoding", // uriencode
    e: [[4,5],[6,7]],   // flatten this
    f: null,            // omit nulls
    g: 0
};

let qs = to_qs(json)

=> "a=1&a=2&a=3&c=1&d=test%26encoding&e=4&e=5&e=6&e=7&g=0"

Bu sürüm, iç içe dizilerle uğraşırken benim için iş yaptı. Ruby / PHP tarzı dizi anahtarlarını kullanmak için hafif bir tweak yaptı ama aksi takdirde harika çalışıyor.
nickb

5

Bu null / undefined değerleri atlar

export function urlEncodeQueryParams(data) {
    const params = Object.keys(data).map(key => data[key] ? `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}` : '');
    return params.filter(value => !!value).join('&');
}

5

ES7'de bunu tek bir satıra yazabilirsiniz:

const serialize = (obj) => (Object.entries(obj).map(i => [i[0], encodeURIComponent(i[1])].join('=')).join('&'))

4

Birinin tekrar ihtiyacı olması durumunda Nesneyi Sorgu Dizesi'ne dönüştürmek için tek satır

let Objs = { a: 'obejct-a', b: 'object-b' }

Object.keys(objs).map(key => key + '=' + objs[key]).join('&')

// result will be a=object-a&b=object-b

4

Herhangi bir üçüncü taraf kitaplığı kullanmayan ve zaten "Object.keys" (aka tüm modern tarayıcılar + edge + ie) olan herhangi bir tarayıcıda kullanılmak üzere uygun basit bir çözüm var:

ES5'te

function(a){
    if( typeof(a) !== 'object' ) 
        return '';
    return `?${Object.keys(a).map(k=>`${k}=${a[k]}`).join('&')}`;
}

ES3'te

function(a){
    if( typeof(a) !== 'object' ) 
        return '';
    return '?' + Object.keys(a).map(function(k){ return k + '=' + a[k] }).join('&');
}

3

Yuvalanmış bir nesneyi özyineli olarak dönüştürmek istiyorsanız ve nesne diziler içerebilir veya içermeyebilirse (ve diziler nesne veya diziler içerebilir, vb.), Çözüm biraz daha karmaşık hale gelir. Bu benim girişimim.

Ayrıca, her bir nesne üyesi için ana nesnenin hangi derinliğinde oturduğunu seçmek ve dönüştürülmüş dizilerden gelen üyelere bir etiket eklemek isteyip istemediğinizi seçmek için bazı seçenekler ekledim.

İdeal olarak, thing parametresinin gerçekten bir nesne veya dizi alıp almadığını test etmelisiniz.

function thingToString(thing,maxDepth,recordLevel,markArrays){
    //thing: object or array to be recursively serialized
    //maxDepth (int or false):
    // (int) how deep to go with converting objects/arrays within objs/arrays
    // (false) no limit to recursive objects/arrays within objects/arrays
    //recordLevel (boolean):
    //  true - insert "(level 1)" before transcript of members at level one (etc)
    //  false - just 
    //markArrays (boolean):
    //  insert text to indicate any members that came from arrays
    var result = "";
    if (maxDepth !== false && typeof maxDepth != 'number') {maxDepth = 3;}
    var runningDepth = 0;//Keeps track how deep we're into recursion

    //First prepare the function, so that it can call itself recursively
    function serializeAnything(thing){
        //Set path-finder values
        runningDepth += 1;
        if(recordLevel){result += "(level " + runningDepth + ")";}

        //First convert any arrays to object so they can be processed
        if (thing instanceof Array){
            var realObj = {};var key;
            if (markArrays) {realObj['type'] = "converted array";}
            for (var i = 0;i < thing.length;i++){
                if (markArrays) {key = "a" + i;} else {key = i;}
                realObj[key] = thing[i];
            }
            thing = realObj;
            console.log('converted one array to ' + typeof realObj);
            console.log(thing);
        }

        //Then deal with it
        for (var member in thing){
            if (typeof thing[member] == 'object' && runningDepth < maxDepth){
                serializeAnything(thing[member]);
                //When a sub-object/array is serialized, it will add one to
                //running depth. But when we continue to this object/array's
                //next sibling, the level must go back up by one
                runningDepth -= 1;
            } else if (maxDepth !== false && runningDepth >= maxDepth) {
                console.log('Reached bottom');
            } else 
            if (
                typeof thing[member] == "string" || 
                typeof thing[member] == 'boolean' ||
                typeof thing[member] == 'number'
            ){
                result += "(" + member + ": " + thing[member] + ") ";
            }  else {
                result += "(" + member + ": [" + typeof thing[member] + " not supported]) ";
            }
        }
    }
    //Actually kick off the serialization
    serializeAnything(thing);

    return result;

}

Özyinelemeli yaklaşım için teşekkürler
Sherlock

3

Kabul edilen çözüm için ek olarak, bu nesneler ve nesne dizisi ile çalışır:

parseJsonAsQueryString = function (obj, prefix, objName) {
    var str = [];
    for (var p in obj) {
        if (obj.hasOwnProperty(p)) {
            var v = obj[p];
            if (typeof v == "object") {
                var k = (objName ? objName + '.' : '') + (prefix ? prefix + "[" + p + "]" : p);
                str.push(parseJsonAsQueryString(v, k));
            } else {
                var k = (objName ? objName + '.' : '') + (prefix ? prefix + '.' + p : p);
                str.push(encodeURIComponent(k) + "=" + encodeURIComponent(v));
                //str.push(k + "=" + v);
            }
        }
    }
    return str.join("&");
}

Ayrıca asp.net mvc eylem yöntemleri gibi nesne parametreleri kullanıyorsanız objName ekledik.


3

Biraz daha iyi görünüyorsun

objectToQueryString(obj, prefix) {
    return Object.keys(obj).map(objKey => {
        if (obj.hasOwnProperty(objKey)) {
            const key = prefix ? `${prefix}[${objKey}]` : objKey;
            const value = obj[objKey];

            return typeof value === "object" ?
                this.objectToQueryString(value, key) :
                `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
        }

        return null;
    }).join("&");
}

3

Ben JSON stringifiers bir karşılaştırma yapılmış ve sonuçları aşağıdaki gibidir:

JSON:    {"_id":"5973782bdb9a930533b05cb2","isActive":true,"balance":"$1,446.35","age":32,"name":"Logan Keller","email":"logankeller@artiq.com","phone":"+1 (952) 533-2258","friends":[{"id":0,"name":"Colon Salazar"},{"id":1,"name":"French Mcneil"},{"id":2,"name":"Carol Martin"}],"favoriteFruit":"banana"}
Rison:   (_id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258')
O-Rison: _id:'5973782bdb9a930533b05cb2',age:32,balance:'$1,446.35',email:'logankeller@artiq.com',favoriteFruit:banana,friends:!((id:0,name:'Colon Salazar'),(id:1,name:'French Mcneil'),(id:2,name:'Carol Martin')),isActive:!t,name:'Logan Keller',phone:'+1 (952) 533-2258'
JSURL:   ~(_id~'5973782bdb9a930533b05cb2~isActive~true~balance~'!1*2c446.35~age~32~name~'Logan*20Keller~email~'logankeller*40artiq.com~phone~'*2b1*20*28952*29*20533-2258~friends~(~(id~0~name~'Colon*20Salazar)~(id~1~name~'French*20Mcneil)~(id~2~name~'Carol*20Martin))~favoriteFruit~'banana)
QS:      _id=5973782bdb9a930533b05cb2&isActive=true&balance=$1,446.35&age=32&name=Logan Keller&email=logankeller@artiq.com&phone=+1 (952) 533-2258&friends[0][id]=0&friends[0][name]=Colon Salazar&friends[1][id]=1&friends[1][name]=French Mcneil&friends[2][id]=2&friends[2][name]=Carol Martin&favoriteFruit=banana
URLON:   $_id=5973782bdb9a930533b05cb2&isActive:true&balance=$1,446.35&age:32&name=Logan%20Keller&email=logankeller@artiq.com&phone=+1%20(952)%20533-2258&friends@$id:0&name=Colon%20Salazar;&$id:1&name=French%20Mcneil;&$id:2&name=Carol%20Martin;;&favoriteFruit=banana
QS-JSON: isActive=true&balance=%241%2C446.35&age=32&name=Logan+Keller&email=logankeller%40artiq.com&phone=%2B1+(952)+533-2258&friends(0).id=0&friends(0).name=Colon+Salazar&friends(1).id=1&friends(1).name=French+Mcneil&friends(2).id=2&friends(2).name=Carol+Martin&favoriteFruit=banana

Bunlar arasında en kısa olanı URL Nesne Gösterimi'dir .


2

Tamam, eski bir yazı ama ben bu sorunla karşı karşıya ve benim kişisel çözüm bulduk .. belki başka birine yardımcı olabilir ..

     function objToQueryString(obj){
        var k = Object.keys(obj);
        var s = "";
        for(var i=0;i<k.length;i++) {
            s += k[i] + "=" + encodeURIComponent(obj[k[i]]);
            if (i != k.length -1) s += "&";
        }
        return s;
     };

2

Çok sayıda iç içe nesneniz varsa yukarıdaki yanıtlar işe yaramaz. Bunun yerine fonksiyon parametresini buradan seçebilirsiniz - https://github.com/knowledgecode/jquery-param/blob/master/jquery-param.js Benim için çok iyi çalıştı!

    var param = function (a) {
    var s = [], rbracket = /\[\]$/,
        isArray = function (obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        }, add = function (k, v) {
            v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v;
            s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v);
        }, buildParams = function (prefix, obj) {
            var i, len, key;

            if (prefix) {
                if (isArray(obj)) {
                    for (i = 0, len = obj.length; i < len; i++) {
                        if (rbracket.test(prefix)) {
                            add(prefix, obj[i]);
                        } else {
                            buildParams(prefix + '[' + (typeof obj[i] === 'object' ? i : '') + ']', obj[i]);
                        }
                    }
                } else if (obj && String(obj) === '[object Object]') {
                    for (key in obj) {
                        buildParams(prefix + '[' + key + ']', obj[key]);
                    }
                } else {
                    add(prefix, obj);
                }
            } else if (isArray(obj)) {
                for (i = 0, len = obj.length; i < len; i++) {
                    add(obj[i].name, obj[i].value);
                }
            } else {
                for (key in obj) {
                    buildParams(key, obj[key]);
                }
            }
            return s;
        };

    return buildParams('', a).join('&').replace(/%20/g, '+');
};

2

JAVASCRIPT NESNE SORGULAMA KODLAMA ES6 ÇÖZÜM

const params = {
  a: 1,
  b: 'query stringify',
  c: null,
  d: undefined,
  f: '',
  g: { foo: 1, bar: 2 },
  h: ['Winterfell', 'Westeros', 'Braavos'],
  i: { first: { second: { third: 3 }}}
}

static toQueryString(params = {}, prefix) {
  const query = Object.keys(params).map((k) => {
    let key = k;
    const value = params[key];

    if (!value && (value === null || value === undefined || isNaN(value))) {
      value = '';
    }

    switch (params.constructor) {
      case Array:
        key = `${prefix}[]`;
        break;
      case Object:
        key = (prefix ? `${prefix}[${key}]` : key);
        break;
    }

    if (typeof value === 'object') {
      return this.toQueryString(value, key); // for nested objects
    }

    return `${key}=${encodeURIComponent(value)}`;
  });

  return query.join('&');
}

toQueryString (parametreler)

"a=1&b=query%20stringify&c=&d=&f=&g[foo]=1&g[bar]=2&h[]=Winterfell&h[]=Westeros&h[]=Braavos&i[first][second][third]=3"

2

Bu, .NET backends için kutudan çıkacak bir çözümdür. Bu iş parçacığının birincil cevabını aldım ve .NET gereksinimlerimize uyacak şekilde güncelledim.

function objectToQuerystring(params) {
var result = '';

    function convertJsonToQueryString(data, progress, name) {
        name = name || '';
        progress = progress || '';
        if (typeof data === 'object') {
            Object.keys(data).forEach(function (key) {
                var value = data[key];
                if (name == '') {
                    convertJsonToQueryString(value, progress, key);
                } else {
                    if (isNaN(parseInt(key))) {
                        convertJsonToQueryString(value, progress, name + '.' + key);
                    } else {
                        convertJsonToQueryString(value, progress, name + '[' + key+ ']');
                    }
                }
            })
        } else {
            result = result ? result.concat('&') : result.concat('?');
            result = result.concat(`${name}=${data}`);
        }
    }

    convertJsonToQueryString(params);
    return result;
}

1

Sadece bunun için bir paket yazdım: object-query-string :)

İç içe nesneleri, dizileri, özel kodlama işlevlerini vb. Destekler. Hafif ve jQuery içermez.

// TypeScript
import { queryString } from 'object-query-string';

// Node.js
const { queryString } = require("object-query-string");

const query = queryString({
    filter: {
        brands: ["Audi"],
        models: ["A4", "A6", "A8"],
        accidentFree: true
    },
    sort: 'mileage'
});

İadeler

filter[brands][]=Audi&filter[models][]=A4&filter[models][]=A6&filter[models][]=A8&filter[accidentFree]=true&sort=milage

0

Başka bir yol (özyinelemeli nesne yok):

   getQueryString = function(obj)
   {
      result = "";

      for(param in obj)
         result += ( encodeURIComponent(param) + '=' + encodeURIComponent(obj[param]) + '&' );

      if(result) //it's not empty string when at least one key/value pair was added. In such case we need to remove the last '&' char
         result = result.substr(0, result.length - 1); //If length is zero or negative, substr returns an empty string [ref. http://msdn.microsoft.com/en-us/library/0esxc5wy(v=VS.85).aspx]

      return result;
   }

alert( getQueryString({foo: "hi there", bar: 123, quux: 2 }) );

0

Json iç içe dizisinin dönüştürülmesini sağlamak için answer @ user187291'den parametre olarak "isArray" ifadesini ekleyin.

data : {
                    staffId : "00000001",
                    Detail : [ {
                        "identityId" : "123456"
                    }, {
                        "identityId" : "654321"
                    } ],

                }

Sonuç almak için:

StaffID = 00000001 & Ayrıntı [0] .identityId = 123456 ve Detay [1] .identityId = 654321

serialize = function(obj, prefix, isArray) {
        var str = [],p = 0;
        for (p in obj) {
            if (obj.hasOwnProperty(p)) {
                var k, v;
                if (isArray)
                    k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
                else
                    k = prefix ? prefix + "." + p + "" : p, v = obj[p];

                if (v !== null && typeof v === "object") {
                    if (Array.isArray(v)) {
                        serialize(v, k, true);
                    } else {
                        serialize(v, k, false);
                    }
                } else {
                    var query = k + "=" + v;
                    str.push(query);
                }
            }
        }
        return str.join("&");
    };

    serialize(data, "prefix", false);

0

Bunu basit JavaScript kullanarak da yapabilirsiniz .

const stringData = '?name=Nikhil&surname=Mahirrao&age=30';
    
const newData= {};
stringData.replace('?', '').split('&').map((value) => {
  const temp = value.split('=');
  newData[temp[0]] = temp[1];
});

console.log('stringData: '+stringData);
console.log('newData: ');
console.log(newData);


1
Bu güzel bir egzersiz, ama bu tam tersi. Sorunun cevabı değil.
Christiaan Westerbeek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.