【问题标题】:Convert an string to object with duplicate keys to an array将字符串转换为具有重复键的对象到数组
【发布时间】:2021-09-28 10:07:33
【问题描述】:

我有一个需要转换为对象的字符串。但是字符串有重复的项目。由于 JSON 对象不能包含具有相同键的 2 个项目。第二项是覆盖第一项。 如何合并重复项并推送到数组?

var string = "test-1=owner&test-1=driver&test-2=Yes&test-3=2&test-4=sun&test-4=moon&test-5=not-agree&test-6=dogs&test-6=testing+js+object&test-7=Testing+js+function&test-7=Testing+js+array"

var stringMod = string.split("&");


var stringObj = {};

stringMod.forEach(function(json) {
  var jsonSplit = json.split("=");

  stringObj[jsonSplit[0]] = [jsonSplit[1]];
});

console.log(stringObj,'stringObj');

期望的输出:

{
  "test-1": ["owner","driver"],
  "test-2": ["Yes"],
  "test-3": ["2"],
  "test-4": ["sun","moon"],
  "test-5": ["not-agree"],
  "test-6": ["dogs","testing+js+object"],
  "test-7": ["Testing+js+function","Testing+js+array"]
}

这里是工作小提琴的链接:https://jsfiddle.net/sjoh9rqp/

你能帮我完成这个吗?

【问题讨论】:

  • 使用[...(stringObj?.[jsonSplit[0]] || []), jsonSplit[1]]; 可能有效。 (虽然不漂亮)

标签: javascript html jquery json object


【解决方案1】:

您可以使用 URLSearchParams 来完成此操作,因为它会将字符串视为 url 参数,但它确实会进行解码。

var string = "test-1=owner&test-1=driver&test-2=Yes&test-3=2&test-4=sun&test-4=moon&test-5=not-agree&test-6=dogs&test-6=testing+js+object&test-7=Testing+js+function&test-7=Testing+js+array"

var data = new URLSearchParams(string);
var obj = {};
for (let x of data.keys()){
  obj[x] = data.getAll(x);
}
console.log(obj);

【讨论】:

    【解决方案2】:

    使用 URLSearchParams 解析查询字符串有助于简化此操作

    var string = "test-1=owner&test-1=driver&test-2=Yes&test-3=2&test-4=sun&test-4=moon&test-5=not-agree&test-6=dogs&test-6=testing+js+object&test-7=Testing+js+function&test-7=Testing+js+array"
    
    const params = new URLSearchParams(string),
          res = {};
    
    
    params.forEach((v,k)=> { 
      res[k] = res[k] || []
      res[k].push(v);  
    })
    
    console.log(res)

    【讨论】:

      【解决方案3】:

      对于多样性,这是使用 reduce() 解决的答案,尽管我不得不承认 URLSearchParams 更优雅

      var string = "test-1=owner&test-1=driver&test-2=Yes&test-3=2&test-4=sun&test-4=moon&test-5=not-agree&test-6=dogs&test-6=testing+js+object&test-7=Testing+js+function&test-7=Testing+js+array"
      
      let obj = string.split('&').reduce((b,a) => {
        let t = a.split('=');
        if (b.hasOwnProperty(t[0])) b[t[0]].push(t[1]);
        else  b[t[0]] =[t[1]];
        return b;
      },{});
      console.log(obj)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多