JavaScript哈希

wtlkbnrh  于 2023-06-28  发布在  Java
关注(0)|答案(9)|浏览(153)

我有这个hash:

{
 a: [1,2],
 b: [1,2,3]
}

我需要生成一个这样的字符串:
a = 1&a = 2&b = 1&b = 2&b = 3
我该如何解决这个问题?我在看lodash,但我不能解决它。
谢谢

3bygqnnd

3bygqnnd1#

使用JavaScript**Object.keys()map()join()ES6 arrow function**

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

iovurdzv2#

一个不错的ES 5解决方案:

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,这样就不会遇到意外的原型属性。

然后,在第一个循环中,你想循环通过 current item中的项目:

我们将用一个常规的for loop来做,因为这些项只是数组。
在这里,我们要调整我们的字符串:

str += prop + '=' + hash[prop][i] + '&';

这将添加我们的属性名称(从for ... in循环中保存为prop),然后添加该属性数组中给定索引i处的值。我们将留下一个尾随的&,我们将在循环外部删除它。

sxpgvts3

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记住,你还应该检查散列中的每个属性是否包含一个有效的数组,并且你没有意外地枚举任何你不想要的属性)

i2byvkas

i2byvkas4#

你可以使用qs来实现。它还将处理所有需要的编码,如果你碰巧超过整数。

qs.stringify({
    a: [1,2],
    b: [1,2,3]
}, { indices: false });
alen0pnh

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("&");
06odsfpq

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

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

gk7wooem

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

hrysbysz9#

如果目的是将数据转换为URL查询参数,请注意,特殊的URL字符应进行URL编码。JavaScript提供了URLSearchParams来构建URL查询/搜索参数,而不用担心编码特殊字符。

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 (const [key, values] of Object.entries(input)) {
  values.forEach(value => searchParams.append(key, value));
}

它只迭代对象自身的属性。

相关问题