想要将嵌套对象转换为查询参数以附加到 url

Sri*_*man 2 javascript query-string

嗨,我需要使用查询参数构造 url 请求,我有一个带有键和值的嵌套对象,如下所示

 "user": {
    "first_name": "Srini",
    "last_name": "Raman",
     "gender": "male",
     "dob": "1992-08-02",
     "address_attributes": {
      "city": "San Diego",
      "state": "CA",
      "zip": 92127,
      "country": "USA",
      "latitude": 37.257009,
      "longitude": -120.050767
    }
}


Run Code Online (Sandbox Code Playgroud)

我需要获得一个查询参数,如

user[first_name]=Srini&user[last_name]=Raman&user[address_attributes][city]=San Diego&user[address_attributes][state]=CA
Run Code Online (Sandbox Code Playgroud)

jun*_*var 6

let obj = {
  user: {
    first_name: 'Srini',
    last_name: 'Raman',
    gender: 'male',
    dob: '1992-08-02',
    address_attributes: {
      city: 'San Diego',
      state: 'CA',
      zip: 92127,
      country: 'USA',
      latitude: 37.257009,
      longitude: -120.050767
    }
  }
};

let getPairs = (obj, keys = []) =>
  Object.entries(obj).reduce((pairs, [key, value]) => {
    if (typeof value === 'object')
      pairs.push(...getPairs(value, [...keys, key]));
    else
      pairs.push([[...keys, key], value]);
    return pairs;
  }, []);

let x = getPairs(obj)
  .map(([[key0, ...keysRest], value]) =>
    `${key0}${keysRest.map(a => `[${a}]`).join('')}=${value}`)
  .join('&');
console.log(x);
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用qs包。

他们的stringify方法似乎完全符合你的要求。

使用示例:

window.addEventListener("load", () => {
  const obj = {
    "user": {
      "first_name": "Srini",
      "last_name": "Raman",
      "gender": "male",
      "dob": "1992-08-02",
      "address_attributes": {
        "city": "San Diego",
        "state": "CA",
        "zip": 92127,
        "country": "USA",
        "latitude": 37.257009,
        "longitude": -120.050767
      }
    }
  };

  console.log(Qs.stringify(obj, { encode: false }));
}, {
  once: true
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.11.0/qs.min.js"></script>
Run Code Online (Sandbox Code Playgroud)