我有以下字符串:
person:juan&age:24&knowledge:html
问题是有时字符串是:
knowledge:html&person:juan&age:24
,它可以更改键的位置和值。
在这种情况下,我会写这样的东西:
const keys = ["person", "age", "knowledge"];
const keyAndValues = "person:juan&age:24&knowledge:html";
const result = [];
keys.forEach(key => {
const indexKeyValues = keyAndValues.indexOf(key);
if (indexKeyValues !== -1) {
const lastCharIndex = keyAndValues.substring(indexKeyValues).indexOf("&");
return keyAndValues.substring(indexKeyValues + key.length, lastCharIndex === -1 ? keyAndValues.substring(indexKeyValues).length - 1 || lastCharIndex);
}
});
,但我不喜欢它,如果我能做这样的事情,那就太好了:
const resultsExpected = /regexGroupedRegardlessOfPosition/g.match("person:juan&age:24&knowledge:html");
console.log(resultsExpected); // { person: "juan", age: 24, knowledge: "html" }
这是获得对象的单个表达式:
const keyAndValues = "person:juan&age:24&knowledge:html";
const obj = Object.assign(...keyAndValues.split('&').map(s => s.split(':'))
.map(([k, v]) => ({ [k]: v }))
);
console.log(obj);
这使用ES6破坏分配,传播语法和计算属性名称。
您可以将字符串分开,然后将零件分开,然后取下对象的键/值。
function getValues(string) {
var object = {};
string && string.split('&').forEach(p => {
var [key, ...value] = p.split(':');
object[key] = value.join(':');
});
return object;
}
console.log(getValues("knowledge:html&person:juan&age:24"));
console.log(getValues("foo:bar:baz&cool:space:aliens:survive"));
console.log(getValues(""));
(knowledge|person|age):([^&]+)
您可能不想接受,但要接受任何密钥:
(w+):([^&]+)
https://regex101.com/r/hww5i1/1/
我认为,将此类型的字符串转换为对象的简单功能可以是更好的解决方案。看看这个:
var keyAndValues = "person:juan&age:24&knowledge:html";
function weirdStringToObject(str){
var obj = {};
str.split('&').forEach(function(substr){
var kv = substr.split(':');
var key = kv[0];
var value = kv[1] || null;
obj[key] = value;
});
return obj;
}
console.log(weirdStringToObject(keyAndValues));
它需要一些额外的验证,但是从这里很容易遵循。
您可以使用:
-
Array.prototype.reduce()
-
String.prototype.split()
-
String.prototype.slice()
-
String.prototype.indexOf()
工作示例:
const str = "person:juan&age:24&knowledge:html";
let result = str.split("&").reduce((r, s) => {
let i = s.indexOf(':');
r[s.slice(0, i)] = s.slice(i + 1);
return r;
}, {});
console.log(result);
正如Phiter所说,我认为Regex对您在这里对您没有真正的帮助。您可能知道这个旧的笑话:"我有问题。我知道!我会使用正则!哦,现在我有两个问题。"
我会在&
上将字符串拆分,然后在:
上为每个子字符串分开,然后填写值:
function strToObject(str) {
var rv = {};
str.split("&").forEach(function(substr) {
var index = substr.indexOf(":");
if (index === -1) {
rv[substr] = undefined;
} else {
rv[substr.substring(0, index)] = substr.substring(index+1);
}
});
return rv;
}
实时示例:
function strToObject(str) {
var rv = {};
str.split("&").forEach(function(substr) {
var index = substr.indexOf(":");
if (index === -1) {
rv[substr] = undefined;
} else {
rv[substr.substring(0, index)] = substr.substring(index+1);
}
});
return rv;
}
console.log(strToObject("person:juan&age:24&knowledge:html"));
console.log(strToObject("knowledge:html&person:juan&age:24"));
.as-console-wrapper {
max-height: 100% !important;
}
这可以使这是一个简短的,
- 使用ES2015 语法。
- 通过创建不必要的临时对象(JavaScript引擎很快创建和破坏对象,因此简短值得成本(。
- 假设值不包含
:
字符。我已经使用indexOf
而不是简单的split
分开名称和值,以允许该值包含:
(例如foo:blah:blah&bar:blah
,其中foo
为"blah:blah"
( —在此情况下,许多其他解决方案(如果不是大多数其他解决方案(在这种情况下抛弃了部分价值