用字符串中的键/值对创建对象



我有以下字符串:

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"( —在此情况下,许多其他解决方案(如果不是大多数其他解决方案(在这种情况下抛弃了部分价值

最新更新