如何使用逗号分隔的冒号分隔键和值对拆分字符串并将其传递给 javascript 对象?

How to split a string with comma separated pairs of colon separated keys and values and pass it into a javascript object?

目前正在对字符串使用 str.split(',') 并将其传递到数组中(同时从字符串中删除 next lines")。字符串如下所示:


let array = [];
const string = "a_key : a_value, b_key: b_value, c_key: c_value";


array = string.replace(/(\r\n|\n|\r|\n)/gm, ' ').replace(/"/g, '').split(',');

结果:

console.log(array);

//result:
['a_key : a_value' 'b_key : b_value' 'c_key : c_value']

这些值需要通过它们的键访问并进一步处理,作为一个对象会更好。

有人看到我在正则表达式链中遗漏了什么吗?

总结:

转这个:

"a_key : a_value, b_key: b_value, c_key: c_value"

进入这个:


{'a_key' : 'a_value', 'b_key' : 'b_value', 'c_key' : 'c_value'}

以下内容应该可以满足您的需求,但它假定值是字符串。

let myObj = {};

for (let el of array) {
  let key_val = el.split(':');
  myObj[key_val[0].trim()] = key_val[1].trim();
}

console.log(myObj);

结果:

{ a_key: 'a_value', b_key: 'b_value', c_key: 'c_value' }

替代解决方案改进了您制作的正则表达式的使用。这可以通过捕获由 :, 分隔的组来维护对象的顺序来完成。看:

const string = "a_key : a_value, b_key: b_value, c_key: c_value";
const obj = {}, re = new RegExp('(.*?):(.*?)(?:,|$)','g')

string.replace(re, (_, key, value) => obj[key.trim()] = value.trim())

console.log(obj)

这个正则表达式是如何工作的?

  (.*?):  matches anything lazily until colon
  (.*?)(?:,|$)  matches anything lazily until comma or end of string

Here 如果您想可视化运行中的正则表达式。

您可以使用 matchAll with 2 capture groups, and map those 2 groups to a multidimensional array, which you can pass to Object.fromEntries.

\s*([^:,]+?)\s*:\s*([^,]+)
  • \s* 匹配可选的空白字符
  • ([^:,]+?) 捕获第 1 组,匹配除 :, 非贪婪
  • 以外的 1+ 个字符
  • \s*:\s* 在可选空白字符之间匹配 :
  • ([^,]+) 捕获组 2,匹配除 ,
  • 之外的任何字符 1+ 次

Regex demo

const string = "a_key : a_value, b_key: b_value, c_key: c_value";
const regex = /\s*([^:,]+?)\s*:\s*([^,]+)/g;

const res = Object.fromEntries(
  Array.from(string.matchAll(regex), m => [m[1], m[2]])
);

console.log(res);