0

JavaScriptを使用してオブジェクトをクエリ文字列に変換したいと考えています。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.paramを使用してうまく動作するJQueryの良い答えが見つかりましたが、ネイティブJSまたはUnderscore.jsを使用した回答が必要です。

どうすればいいですか?

答えて

3

既存の車輪を再発明しようとは勧めません。独自の実装はおそらく、柔軟性が低く、エラーが発生しやすくなります(クエリ文字列パラメータを正しくエンコードすることを考えましたか?)代わりに、query-stringモジュールを見てください。

あなたがこれを行うことができます
+0

どういう意味ですか?私は実装を追加しませんでした。私は実装を求めています。また、私が提供したURLはコード化されていると信じています。 http://www.freeformatter.com/url-parser-query-string-splitter.htmlを見て、URLを貼り付けて見てください。 –

+0

私が言っていることは、あなたが作ろうとしている実装は、ファンキーなエッジケースに注意を払い、適切なテストスイートを持っている既存のモジュールよりもずっと悪くなってしまう可能性が高いということです。 –

+0

ああ、ライブラリを使用するだけです –

0

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

GET:?=こんにちは& B%5Bb1%5D =私の& B%5Bb2%5Dは=友人& B%5Bb3%5D%5BC%5D = 90

関連する問題