将字符串转换为具有重复键的对象到数组
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