Javascript 在字符串中创建具有键/值对的对象?
我有以下字符串:Javascript 在字符串中创建具有键/值对的对象?,javascript,arrays,regex,string,object,Javascript,Arrays,Regex,String,Object,我有以下字符串: 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
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" }
正如我所说,我认为正则表达式在这里对你没有什么帮助。你可能知道一个老笑话:“我有一个问题。我知道!我将使用正则表达式!哦,现在我有两个问题。”
我在&
上拆分字符串,然后在:
上为每个子字符串填充以下值:
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;
}
实例:
函数strToObject(str){
var rv={};
str.split(“&”)forEach(函数(substr){
var index=substr.indexOf(“:”);
如果(索引==-1){
rv[substr]=未定义;
}否则{
rv[子字符串(0,索引)]=子字符串(索引+1);
}
});
返回rv;
}
log(strToObject(“person:juan&age:24&knowledge:html”);
log(strToObject(“knowledge:html&person:juan&age:24”)代码>
。作为控制台包装器{
最大高度:100%!重要;
}
您可能不想这样做,但要接受任何密钥:
(\w+):([^&]+)
我认为一个简单的函数可以将这种类型的字符串转换为对象,这是一个更好的解决方案。看看这个:
var-keyAndValues=“个人:胡安&年龄:24岁&知识:html”;
函数weirdStringToObject(str){
var obj={};
str.split('&').forEach(函数(substr){
var kv=子拆分(“:”);
var键=千伏[0];
var值=千伏[1]| |零;
obj[键]=值;
});
返回obj;
}
log(weirdStringToObject(keyAndValues))代码>您可以利用:
工作示例:
const str=“个人:年龄:24岁知识:html”;
让结果=str.split(&”).reduce((r,s)=>{
设i=s.indexOf(':');
r[s切片(0,i)]=s切片(i+1);
返回r;
}, {});
控制台日志(结果)代码>您可以拆分字符串,然后拆分部分,并获取对象的键/值
函数getValues(字符串){
var对象={};
string&&string.split('&').forEach(p=>{
var[key,…value]=p.split(':');
object[key]=value.join(':');
});
返回对象;
}
log(getValues(“knowledge:html&person:juan&age:24”);
log(getValues(“foo:bar:baz&cool:space:异形:生存”);
console.log(getValues(“”)代码>以下是获取对象的单个表达式:
constkeyandvalues=“个人:胡安&年龄:24岁&知识:html”;
const obj=Object.assign(…keyAndValues.split('&').map(s=>s.split(':'))
.map(([k,v])=>({[k]:v}))
);
控制台日志(obj)我认为在这种情况下,正则表达式不是最好的解决方案。老实说,我甚至不认为它适用于这个问题的任何解决方案。为什么可能有一种方法可以抓住中间的东西:和链的开始,看看它是否属于一个键,然后抓住它的价值我认为如果它起作用,你应该使用你拥有的东西。它简单易读,老实说,regex很少是这样。看起来你最好在&
上拆分字符串,然后在上拆分每个结果:
听起来很合理@MattBurland,这会使它更可读。我在第一个实现中使用了map
,但这很愚蠢。在我开始写作之后,我注意到不可能将key:value
与.map
成对返回。这是ES6语法,对吗?创建var[key,value]
的部分?@Phiter,对,它是一个。对部分使用split
:
假设值永远不会包含:
,当然。@T.J.Crowder,在这种情况下需要一些转义。@NinaScholz:不,不需要转义。条目之间的分隔符是和。请看我的答案。如果我们只定义一个“映射”而不是2个,它是否会减少迭代次数?非常简洁,但是@juangarcia:请注意,对:
部分使用拆分,当然,假设该值永远不会包含:
。(这也会为每个条目创建一个一次性对象,但JavaScript引擎在创建和丢弃对象方面很快。)@juangarcia,你可以用一个映射来完成,但是你需要将拆分的结果存储在变量中,然后从中返回合成的对象:这不像两个map
调用那样优雅,每个调用都有自己的表达式。诚然,您有一个额外的迭代,但它也用于分解分配的目的,并且不影响总体时间复杂度。
(\w+):([^&]+)