求教一个json对象用原生方法转成url拼接参数?

一个未知格式的对象,现在只能勉强使用jquery的each来递归实现。
如果使用原生方法该如何实现??求教。

 var obj = {
      "test": 123123,
      "fruit": '535',
      "book": {
        'aaa': 456,
        'bbb': 789,
        'ccc': {
          'asd': 333,
          'af': true
        }
      }
    }
   export const parseParam = function(param, key, prefix) {
       //prefix 是否带"&"连接符前缀 
      let paramStr = prefix ? "&" : "";
      if (param instanceof String || param instanceof Number || param instanceof Boolean) {
        paramStr += `&${key}=${encodeURIComponent(param)}`
      } else {
      // 这里使用$.each勉强实现
        $.each(param, function(i) {
          let k = key === null ? i : key + (prefix ? i : `.${i}`);
          paramStr += `&${parseParam(this, k)}`;
        });
      }
      return paramStr.substr(1);
    };
     //这里的key和prefix参数没有处理好,不知怎样写可以更规范一些
    console.log(parseParam(obj, '', true))
阅读 5.2k
4 个回答

<head>

</head>

<body>
<script>
let obj = {

    a:'aaa',
    b:'bbbb',
    c:{
            c1:'c1c1c1',
            c2:'c2c2c2',
            c3:{
            c3a:'c3ac3a',
            c3b:'c3bc3b'
            }
    },
    d:'ddd',

}

function encodeUrl(obj){

    let url ='';

(function (obj){

    let kvArr = Object.entries(obj);
    kvArr.forEach(v=>{
            if(Object.prototype.toString.call(v[1]) =='[object Object]')

{

                    arguments.callee(v[1]);
            }else{
                    url += v.join('=')+'&'
            }
    })
    

})(obj)
return url.substring(0,url.length-1);
}

let res =encodeUrl(obj);
console.log(res);
</script>
</body>

最原始的写法,至于具体的,自己请参考

var obj = {
      "test": 123123,
      "fruit": '535',
      "book": {
        'aaa': 456,
        'bbb': 789,
        'ccc': {
          'asd': 333,
          'af': true
    }
  }
};

function buildUri(obj){
  var uri = '';
  for(var index in obj){
    if(isEmpty(obj[index])){
      uri +=( index + '=' + obj[index] + '&');
    }else{
      uri += buildUri(obj[index]);
    }
  }
  return uri;
}

function isEmpty(obj){
  if(typeof obj == 'string' ) return true;
  for(var i in obj){
    return false;
  }
  return true;
}

var uri = buildUri(obj);
console.dir(uri.substr(0,uri.length -1));

你这样写,encode不方便,decode也不方便啊。
不如encode的时候直接用JSON.stringify把这个对象转成字符串参数,decode的时候再用JSON.parse解析参数

你都用了jQuery,为啥不考虑下$.param,或者去看看他的源码。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题