我有这个hash:
{ a: [1,2], b: [1,2,3] }
我需要生成一个这样的字符串:a = 1&a = 2&b = 1&b = 2&b = 3我该如何解决这个问题?我在看lodash,但我不能解决它。谢谢
3bygqnnd1#
使用JavaScript**Object.keys()、map()和join()与ES6 arrow function**
Object.keys()
map()
join()
var arr = { a: [1, 2], b: [1, 2, 3] }; var res = Object.keys(arr).map(v => arr[v].map(v1 => v + '=' + v1).join('&')).join('&'); document.write(res);
或无箭头功能
var arr = { a: [1, 2], b: [1, 2, 3] }; var res = // get object keys Object.keys(arr) // iterate over object keys and iterate .map(function(v) { // iterate over inner array return arr[v].map(function(v1) { // generate prefered string and return return v + '=' + v1 // cconcatenate string array }).join('&') // concatenate string array }).join('&'); document.write(res);
iovurdzv2#
function hashToString(hash) { var str = ''; for ( prop in hash ) { if ( !hash.hasOwnProperty(prop) ) continue; for (var i = 0; i < hash[prop].length; i++) { str += prop + '=' + hash[prop][i] + '&'; }; } str = str.slice(0, str.length-1); return str; }
试试看!
您可以使用for ... in loop来执行此操作。您应该检查hasOwnProperty,这样就不会遇到意外的原型属性。
for ... in
hasOwnProperty
我们将用一个常规的for loop来做,因为这些项只是数组。在这里,我们要调整我们的字符串:
for
str += prop + '=' + hash[prop][i] + '&';
这将添加我们的属性名称(从for ... in循环中保存为prop),然后添加该属性数组中给定索引i处的值。我们将留下一个尾随的&,我们将在循环外部删除它。
prop
i
&
sxpgvts33#
使用for in循环迭代hash对象中的每个属性,并从那里将每个值添加到字符串中,如下所示:
function hashToQueryString(hash) { var query = ''; for (key in hash) { for (i=0; i<=key.length; i++) { query += key+'='+ myJSON[key]+'&'; } } //remove the trailing & query = query.substr(0, query.length -1); return query; }
(Keep记住,你还应该检查散列中的每个属性是否包含一个有效的数组,并且你没有意外地枚举任何你不想要的属性)
i2byvkas4#
你可以使用qs来实现。它还将处理所有需要的编码,如果你碰巧超过整数。
qs.stringify({ a: [1,2], b: [1,2,3] }, { indices: false });
alen0pnh5#
我相信有一个更干净的方法,但这里有一些减少和Map的选择。
var obj = { a: [1,2], b: [1,2,3] }; var params = Object.keys(obj).reduce( function (arr, key){ arr.push(key + "=" + obj[key].join("&" + key + "=")) return arr; }, []).join("&");
或者是否需要为查询字符串编码值
var params = Object.keys(obj).reduce( function (arr, key){ var mapped = obj[key].map( function (val) { return key + "=" + encodeURIComponent(val); }).join("&"); arr.push(mapped) return arr; }, []).join("&");
06odsfpq6#
let hash = { a: [1, 2], b: [1, 2, 3] }; let str = ''; for (let key in hash) { for (let value of hash[key]) { str += `${key}=${value}&`; } } alert(str.slice(0, -1));
jei2mxaa7#
如果你不得不继续使用糟糕的旧ES5,并且不想使用 * 另一个库来完成简单的任务 *:
var myHash = { a: [1,2], b: [1,2,3] } var myString = ''; Object.keys(myHash).map(function(key, index) { myHash[key].map(function(value) { myString += (myString ? '&' : '') + key + '=' + value; }); });
jsfiddle
gk7wooem8#
下面是一个简单的JavaScript哈希一行程序,我命名为pr2:function pr2(str){let e=9833;for(let n=0;n<str.length;n++){const r=str.charCodeAt(n);e=43*e^r}return e>>>0}如果这对你的目的还不够好,这里是MurMurHash 3:
function pr2(str){let e=9833;for(let n=0;n<str.length;n++){const r=str.charCodeAt(n);e=43*e^r}return e>>>0}
function murmurhash3_32(str, seed) { // MurMurHash is better than djb2, djb2 XOR, and FNV hash in speed, security, and collision probability. // Version 3 is better than version 2 // Javascript implementation of MurMurHash 3 // String must be ASCII only! // Seed must be positive integer only! var strLength = str.length; var remainder = strLength & 3; // strLength % 4 var bytes = strLength - remainder; var h1 = seed; var c1 = 0xcc9e2d51; var c2 = 0x1b873593; var i = 0; while (i < bytes) { var k1 = (str.charCodeAt(i) & 0xff) | ((str.charCodeAt(++i) & 0xff) << 8) | ((str.charCodeAt(++i) & 0xff) << 16) | ((str.charCodeAt(++i) & 0xff) << 24); ++i; k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; h1 = (h1 << 13) | (h1 >>> 19); var h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff; h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16); } var k1 = 0; switch (remainder) { case 3: k1 ^= (str.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (str.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= str.charCodeAt(i) & 0xff; k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; k1 = (k1 << 15) | (k1 >>> 17); k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; h1 ^= k1; } h1 ^= strLength; h1 ^= h1 >>> 16; h1 = ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 13; h1 = ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; } // end of function let string = prompt('string to hash') let seed = prompt('seed for the hash (positive integer)') let hashed = murmurhash3_32(string, seed) console.log('Hashed: ' + hashed) alert('Hashed: ' + hashed)
hrysbysz9#
如果目的是将数据转换为URL查询参数,请注意,特殊的URL字符应进行URL编码。JavaScript提供了URLSearchParams来构建URL查询/搜索参数,而不用担心编码特殊字符。
URLSearchParams
const input = { a: [1, 2], b: [1, 2, 3], }; const searchParams = new URLSearchParams(); for (const key in input) { input[key].forEach(value => searchParams.append(key, value)); } const desired = searchParams.toString(); console.log(desired);
请注意,我使用for...in迭代,它迭代原型链上的所有可迭代属性。如果需要,您可以轻松地替换它,例如:
for...in
for (const [key, values] of Object.entries(input)) { values.forEach(value => searchParams.append(key, value)); }
它只迭代对象自身的属性。
9条答案
按热度按时间3bygqnnd1#
使用JavaScript**
Object.keys()
、map()
和join()
与ES6 arrow function**或无箭头功能
iovurdzv2#
一个不错的ES 5解决方案:
试试看!
工作原理:
好吧!到底怎么了?
首先,您需要循环遍历第一层的每个项。
您可以使用
for ... in
loop来执行此操作。您应该检查hasOwnProperty
,这样就不会遇到意外的原型属性。然后,在第一个循环中,你想循环通过 current item中的项目:
我们将用一个常规的
for
loop来做,因为这些项只是数组。在这里,我们要调整我们的字符串:
这将添加我们的属性名称(从
for ... in
循环中保存为prop
),然后添加该属性数组中给定索引i
处的值。我们将留下一个尾随的&
,我们将在循环外部删除它。sxpgvts33#
使用for in循环迭代hash对象中的每个属性,并从那里将每个值添加到字符串中,如下所示:
(Keep记住,你还应该检查散列中的每个属性是否包含一个有效的数组,并且你没有意外地枚举任何你不想要的属性)
i2byvkas4#
你可以使用qs来实现。它还将处理所有需要的编码,如果你碰巧超过整数。
alen0pnh5#
我相信有一个更干净的方法,但这里有一些减少和Map的选择。
或者是否需要为查询字符串编码值
06odsfpq6#
jei2mxaa7#
如果你不得不继续使用糟糕的旧ES5,并且不想使用 * 另一个库来完成简单的任务 *:
jsfiddle
gk7wooem8#
下面是一个简单的JavaScript哈希一行程序,我命名为pr2:
function pr2(str){let e=9833;for(let n=0;n<str.length;n++){const r=str.charCodeAt(n);e=43*e^r}return e>>>0}
如果这对你的目的还不够好,这里是MurMurHash 3:
hrysbysz9#
如果目的是将数据转换为URL查询参数,请注意,特殊的URL字符应进行URL编码。JavaScript提供了
URLSearchParams
来构建URL查询/搜索参数,而不用担心编码特殊字符。请注意,我使用
for...in
迭代,它迭代原型链上的所有可迭代属性。如果需要,您可以轻松地替换它,例如:它只迭代对象自身的属性。