鍍金池/ 問答/HTML/ 求教一個json對象用原生方法轉(zhuǎn)成url拼接參數(shù)?

求教一個json對象用原生方法轉(zhuǎn)成url拼接參數(shù)?

一個未知格式的對象,現(xiàn)在只能勉強使用jquery的each來遞歸實現(xiàn)。
如果使用原生方法該如何實現(xiàn)??求教。

 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勉強實現(xiàn)
        $.each(param, function(i) {
          let k = key === null ? i : key + (prefix ? i : `.${i}`);
          paramStr += `&${parseParam(this, k)}`;
        });
      }
      return paramStr.substr(1);
    };
     //這里的key和prefix參數(shù)沒有處理好,不知怎樣寫可以更規(guī)范一些
    console.log(parseParam(obj, '', true))
回答
編輯回答
掛念你

<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>

2018年8月16日 01:42
編輯回答
純妹

你這樣寫,encode不方便,decode也不方便啊。
不如encode的時候直接用JSON.stringify把這個對象轉(zhuǎn)成字符串參數(shù),decode的時候再用JSON.parse解析參數(shù)

2018年7月22日 12:54
編輯回答
心上人

你都用了jQuery,為啥不考慮下$.param,或者去看看他的源碼。

2017年3月8日 20:05
編輯回答
殘淚

最原始的寫法,至于具體的,自己請參考

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));
2018年3月26日 13:45