解析数组并将值转换为对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析数组并将值转换为对象相关的知识,希望对你有一定的参考价值。
我有一个数组,需要将其转换为具有给定值的对象。
这是输入数组
let actions = ['CREATE: id=14&amount=800¤cy=USD','FINALIZE: id=14&amount=800¤cy=USD','PAY: id=14'
]
我如何将其变成这个对象。
let result =
'create': 800,
'finalize': 800,
'pay':14
到目前为止,我有一个循环来检查数组中的键是否可用,但是我在接下来的步骤中迷路了。一位同事说,正则表达式可能是最好的选择。
for(let x = 0; x <=actions.length;x++)
if(actions[x].icludes('CREATE'))
else(actions[x].icludes('FINALIZE'))
else(actions[x].icludes('PAY'))
感谢蚂蚁的帮助。
您可以在:\s+
处拆分每个字符串以获取密钥和要分析的字符串。您将在结果数组中获得2个值。使用destructuring可以将它们分隔为变量
["CREATE", "id=14&amount=800¤cy=USD"]
然后在第二个值上使用URLSearchParams
构造函数从查询字符串中获取键值对。
某些键需要URLSearchParams
,而有些键需要amount
的值。因此,您可以创建一个映射器对象。这会将键与要在URLSearchParams中搜索的name映射。
id
这里,const mapper =
PAY: "id",
CREATE: 'amount',
FINALIZE: 'amount',
default: "amount"
;
需要PAY
值。如果有更多键,则可以在此处添加。您也可以将id
添加到该对象。但是,由于是CREATE: "amount"
,所以我跳过了这一点。如果在default
中找不到键,则可以使用default
键。从解析函数返回带有键和值的对象。
然后mapper
数组并合并每个解析的对象以创建输出
reduce
考虑到您的预期输出不会遵循单一结构,我选择返回所有值,而不是返回任意值。但是,如果您有一些业务逻辑证明选择不同的值返回是合理的,则可以轻松地更改代码以适应这种情况。
reduce
作为正则表达式示例,这也可能起作用。当然,可能总是会有更健壮的正则表达式规则。 (且更具可扩展性)
const actions = ['CREATE: id=14&amount=800¤cy=USD', 'FINALIZE: id=14&amount=800¤cy=USD', 'PAY: id=14']
const mapper =
PAY: "id",
//CREATE: 'amount', // you could add CREATE and FINALIZE if you want
default: "amount"
;
function parse(str)
const [key, value] = str.split(/:\s+/);
const param = new URLSearchParams(value).get(mapper[key] || mapper.default);
return [key.toLowerCase()]: param ;
const output = actions.reduce((acc, str) => Object.assign(acc, parse(str)), );
console.log(output)
这里是解决方法:
const actions = [
'CREATE: id=14&amount=800¤cy=USD',
'FINALIZE: id=14&amount=800¤cy=USD',
'PAY: id=14'
];
const actionsData = actions.reduce((res, str) =>
const [op, query] = str.split(': ');
const kvPairs = query.split('&');
const data = kvPairs.reduce((res, kvStr) =>
const [key, value] = kvStr.split('=');
res[key] = value;
return res;
, );
res[op] = data;
return res;
, );
console.log(actionsData);
所以,现在有了一个对象,actionObject,它包含金额,但仅适用于包含金额或id的值。
let actions = [
'CREATE: id=14&amount=800¤cy=USD',
'FINALIZE: id=14&amount=800¤cy=USD',
'PAY: id=14'
]
let result = actions.reduce((acc, item) =>
if (item.match(/^CREATE:.+amount=(\d+)/))
acc.create = item.match(/^CREATE:.+amount=(\d+)/)[1];
else if (item.match(/^FINALIZE:.+amount=(\d+)/))
acc.finalize = item.match(/^FINALIZE:.+amount=(\d+)/)[1];
else if (item.match(/^PAY:.+id=(\d+)/))
acc.id = item.match(/^PAY:.+id=(\d+)/)[1];
;
return acc;
, )
console.log(result);
以上是关于解析数组并将值转换为对象的主要内容,如果未能解决你的问题,请参考以下文章