将字符串转换为具有重复键的对象到数组

Posted

技术标签:

【中文标题】将字符串转换为具有重复键的对象到数组【英文标题】: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]]; 可能有效。 (虽然不漂亮) 【参考方案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)

【讨论】:

以上是关于将字符串转换为具有重复键的对象到数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象数组转换为在打字稿中具有动态键的单个对象

将字符串数组转换为哈希图[重复]

带有重复键的 libpostal 输出字符串(dict),我需要将字符串转换为 Dict

将数据数组转换为具有属性的对象[重复]

将字符串数组转换为 Arraylist 的 ArrayList [重复]

如何将字符串数字的单元格数组转换为数值向量[重复]