解析数组并将值转换为对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析数组并将值转换为对象相关的知识,希望对你有一定的参考价值。

我有一个数组,需要将其转换为具有给定值的对象。

这是输入数组

let actions = ['CREATE: id=14&amount=800&currency=USD','FINALIZE: id=14&amount=800&currency=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&currency=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&currency=USD', 'FINALIZE: id=14&amount=800&currency=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&currency=USD',
  'FINALIZE: id=14&amount=800&currency=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&currency=USD',
  'FINALIZE: id=14&amount=800&currency=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);

以上是关于解析数组并将值转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中解析 json 并将值添加到对象数组

php解析xml,并将xml转换为层级数组

解析列中具有动态键的 JSON 值并将 JSON 转换为 BigQuery 中的记录列结构

如何在PHP中解析json

Swift 和 JSON 只解析一个对象而不是一个数组

如何解析 JSON 以将其转换为 Swift 中的对象数组?