Разделите строку JS, затем сгруппируйте ее значения в объект - PullRequest
0 голосов
/ 22 января 2020

Итак, я получил следующую строку let x = "4 months 3 weeks 1 day". Это также может быть простой let x = "2 weeks".

. Я пытаюсь разделить это x на пробелы, а затем сгруппировать возвращаемые значения следующим образом:

{
months: 4,
weeks: 3,
day: 1
}

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

let y = x.split(/ (?=[^,]+:)/).map(s => s.split(' '));

Вышеприведенный код возвращает следующий массив ["2", "Weeks", "1", "Day"].

Как я должен справиться с переворотом, соответственно преобразовав результат в объект.

Ответы [ 5 ]

3 голосов
/ 22 января 2020

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

let x = "4 months 3 weeks 1 day",
    result = x
        .match(/\d+\D+/g)
        .reduce((r, s) => {
            var [v, k] = s.match(/(\d+)(\D+)/).slice(1);
            r[k.trim()] = +v;
            return r;
        }, {});

console.log(result);
2 голосов
/ 22 января 2020

Я бы сопоставил \S+ \S+ (непробельные символы, затем пробел, за которым следуют другие непробельные символы), затем сопоставили бы массив записей, разделив пробел, и, наконец, поместили бы его в объект с Object.fromEntries:

let x = "4 months 3 weeks 1 day";
const obj = Object.fromEntries(
  x.match(/\S+ \S+/g).map(match => {
    const [val, key] = match.split(' ');
    return [key, Number(val)];
  })
);
console.log(obj);

Более кратко, используя .matchAll:

const x = "4 months 3 weeks 1 day";
const obj = Object.fromEntries(
  [...x.matchAll(/(\S+) (\S+)/g)]
    .map(([_, val, key]) => [key, Number(val)])
);
console.log(obj);

Другой вариант:

const x = "4 months 3 weeks 1 day";
const obj = {};
for (const match of x.match(/\S+ \S+/g)) {
  const [val, key] = match.split(' ');
  obj[key] = Number(val);
}
console.log(obj);
1 голос
/ 22 января 2020

Используя for l oop, вы можете создать объект из массива, а затем просто назначить этот объект нужному объекту:

let obj = {};
for (let i = 0; i < arr.length; i+=2) {
  let result = Object.fromEntries([[arr[++i], arr[--i]]]);
  Object.assign(obj, result);
}

Пример:

let x = "4 months 3 weeks 1 day";
let arr = x.split(' ');
let obj = {};
for (let i = 0; i < arr.length; i+=2) {
  let result = Object.fromEntries([[arr[++i], arr[--i]]]);
  Object.assign(obj, result);
}

console.log(obj)
0 голосов
/ 22 января 2020

Просто вы можете использовать следующий код:

let x = "4 months 3 weeks 1 day";
let dataArray = x.split(" ")

var finalObj = {}
for(var i=0; i< dataArray.length; i++) {
	if(/^[0-9]*$/.test(dataArray[i])) {
  	finalObj[dataArray[i+1]] = dataArray[i];
  }
}
console.log(finalObj)
0 голосов
/ 22 января 2020

Пожалуйста, попробуйте ниже фрагмента. он полностью заполнит ваше требование.

let x = "4 months 3 weeks 1 day";
let y = x.split(/([0-9]{1,}\s[A-Za-z]{1,})/);
y = y.filter(q => {return q.trim()});
let temp = {}
y.forEach(q => temp[q.split(" ")[1]] = q.split(" ")[0]); 
...