如何使用逗号分隔的冒号分隔键和值对拆分字符串并将其传递给 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+ 次
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);
目前正在对字符串使用 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+ 次
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);