javascript - 使用 JavaScript 将嵌套对象/关联数组转换为查询字符串

标签 javascript underscore.js query-string javascript-objects

我想使用 JavaScript 将对象转换为查询字符串。

例如,我要转换:

{
    a: 'hello',
    b: {
      b1: 'my',
      b2: 'friend',
      b3: {
          c: 90
      }
    }
}

至:

?a=hello&b%5Bb1%5D=my&b%5Bb2%5D=friend&b%5Bb3%5D%5Bc%5D=90

我在这里找到了很多答案:Flatten a javascript object to pass as querystring ,但它们似乎没有处理关联数组(或对象内的对象)的问题。

我找到了一个很好的 JQuery 答案,它可以使用 jQuery.param 正常工作,但我想要使用 native JS 或 Underscore.js 的答案。

我该怎么做?

最佳答案

你可以这样做:

let obj = {
        a: 'hello',
        b: {
          b1: 'my',
          b2: 'friend',
          b3: {
              c: 90
          }
        }
    }

function getQueryString(obj, encode) {

      function getPathToObj(obj, path = []) {
        let result = [];

        for (let key in obj) {
          if (!obj.hasOwnProperty(key)) return;

          //deep copy
          let newPath = path.slice();
          newPath.push(key);

          let everyPath = [];
          if (typeof obj[key] === "object") {
            everyPath = getPathToObj(obj[key], newPath);
          } else {
            everyPath.push({
              path: newPath,
              val: obj[key]
            });
          }

          everyPath.map((item) => result.push(item))
        }

        return result;
      }

      function composeQueryString(paths) {
        let result = "";
        paths.map((item) => {
          let pathString = "";
          if (item.path.length > 1) {
            pathString = item.path.reduce((a, b, index) => {
              return a + '['+ b +']';
            })
          } else {
            pathString = item.path[0];
          }

          if (result) {
            pathString = "&" + pathString + '=' + item.val;
          } else {
            pathString = "?" + pathString + '=' + item.val;
          }

          result += pathString;
        });

        return result;
      }

      const str = composeQueryString(getPathToObj(obj));
      return encode === true ? encodeURI(str) : str;
    }
    console.log(getQueryString(obj, true));

获取:?a=你好&b%5Bb1%5D=我的&b%5Bb2%5D= friend &b%5Bb3%5D%5Bc%5D=90

关于javascript - 使用 JavaScript 将嵌套对象/关联数组转换为查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109545/

相关文章:

javascript - 简单的动画播放/倒退按钮

javascript - 为什么这段 JavaScript 代码会忽略超时?

javascript - 如何将这个工作 native ES5 代码转换为使用下划线的 _.bind() ?

api - 带键但不带值的查询字符串

C# 使用HttpContext.Current.Request 在手机浏览器上请求时无法获取QueryString e

javascript - node.js 中的 promise

javascript - 更改自动完成的宽度

javascript - 重写展平函数

javascript - Lodash 功能无法正常使用

apache - 带有查询字符串的 httpd 缓存规则