У меня есть следующая строка:

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" }
4
juan garcia 26 Фев 2018 в 20:47

5 ответов

Лучший ответ

Вот одно выражение для получения объекта:

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);

При этом используется ESa назначение деструктурирования, синтаксис распространения и имена вычисляемых свойств.

3
trincot 26 Фев 2018 в 18:05

Я думаю, что простая функция, которая преобразует этот тип строки в объект, может быть лучшим решением. Посмотри на это:

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));

Это требует немного дополнительной проверки, но отсюда легко следовать.

1
Phiter 26 Фев 2018 в 17:56
(knowledge|person|age):([^&]+)

Вы, вероятно, не хотите, но принять любой ключ:

(\w+):([^&]+)

https://regex101.com/r/HwW5I1/1/

2
zzxyz 26 Фев 2018 в 18:25

Вы можете разделить строку, а затем части и взять ключ / значения для объекта.

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(""));
3
Nina Scholz 26 Фев 2018 в 18:40

Вы можете использовать:

Рабочий пример .

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);
1
Mohammad Usman 26 Фев 2018 в 18:02