【问题标题】:Convert string with ampersands into a key value map in Javascript (node js)将带有&符号的字符串转换为Javascript(节点js)中的键值映射
【发布时间】:2019-11-05 16:50:14
【问题描述】:

我有一个字符串,其参数用 & 号分隔,例如:

orderid=55e3a83e&DealId=545435&Amount=590 ....

如何将其转换为键/值映射?

我目前的代码如下:

  const text = "orderid=55e3a83e&DealId=545435&Amount=590 ...."


      let _key = "";
      let _value = "";

      var myregexp = /([^&=]+)=(.*?)(?=&[^&=]+=|$)/g;
      var match = myregexp.exec(text);
      while (match != null && key !== "url") {
        _key = match[1];
        _value = match[2];
        dict.push({
          key: _key,
          value: _value
        });
        match = myregexp.exec(subject);
      }

但它太长了,有什么更好或更短的想法吗?

【问题讨论】:

  • CodeManiac 的回答很棒,但您确实需要考虑是否会支持更复杂的查询字符串。许多地方通过重复键在查询中传递数组,例如,“foo=1&bar=2&bar=3&bar=4”,它应该返回bar 的值[2, 3, 4]。大多数简单的技术都无法解决这个问题。但话又说回来,你可能不需要。
  • 这能回答你的问题吗? Convert URL parameters to a JavaScript object

标签: javascript node.js dictionary


【解决方案1】:

你可以先用&拆分,再用=拆分每个元素,构建key/value对

let mapper = (str) => str.split('&').filter(Boolean).map(v => {
  let [key, value] = v.split('=')
  return { key, value }
})
console.log(mapper('orderid=55e3a83e&DealId=545435&Amount=590 '))

如果需要以单个对象的形式输出

let mapper = (str) => {
  let splitted = str.split('&').map(v => v && v.split('=')).filter(Boolean)
  return Object.fromEntries(splitted)
}

console.log(mapper('orderid=55e3a83e&DealId=545435&Amount=590 '))

【讨论】:

  • 所以返回值是一个对象而不是字典?
  • 如何从字典中获取值?我试过dict['key'],但它没有产生任何价值。谢谢
  • @JAN 你需要使用 find 方法,find
【解决方案2】:

我一直使用一些与您当前解决方案非常相似的代码:

function getUrlParams(input) {
    var params = {};
    input.replace(/[?&]+([^=&]+)=([^&]*)/g, (m, key, value) => {
            params[key] = value;
        });
    return params;
}

当然,这不会忽略URL 参数,它会返回一个普通的JS 对象……但你明白了。

【讨论】:

    【解决方案3】:

    字符串看起来像一个URL查询,你可以使用URLSearchParams来解析它,这里是一个例子:

    const usp = new URLSearchParams('orderid=55e3a83e&DealId=545435&Amount=590');
    
    const dictionary = [];
    
    for (const [key, value] of usp.entries()) {
      dictionary.push({ key, value})
    }
    
    console.log(dictionary);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多