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)&
上拆分字符串,然后在
上拆分每个结果:
听起来很合理@MattBurland,这会使它更可读。我在第一个实现中使用了
map
,但这很愚蠢。在我开始写作之后,我注意到不可能将
key:value
.map
成对返回。这是ES6语法,对吗?创建
var[key,value]
的部分?@Phiter,对,它是一个。对
部分使用
split
假设值永远不会包含
,当然。@T.J.Crowder,在这种情况下需要一些转义。@NinaScholz:不,不需要转义。条目之间的分隔符是
。请看我的答案。如果我们只定义一个“映射”而不是2个,它是否会减少迭代次数?非常简洁,但是@juangarcia:请注意,对
部分使用
拆分
,当然,假设该值永远不会包含
。(这也会为每个条目创建一个一次性对象,但JavaScript引擎在创建和丢弃对象方面很快。)@juangarcia,你可以用一个
映射来完成,但是你需要将
拆分的结果存储在变量中,然后从中返回合成的对象:这不像两个
map
调用那样优雅,每个调用都有自己的表达式。诚然,您有一个额外的迭代,但它也用于分解分配的目的,并且不影响总体时间复杂度。
(\w+):([^&]+)