Преобразовать массив, содержащий строки, в пары ключ-значение - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть строка "101-2000-10-102-2000-15", которую я должен отобразить как ключ: 101 значение: {2000, 10}. С помощью приведенного ниже кода я могу получить вывод как 101 => 2000, но я не могу с одним оставшимся значением. Это код:

let myString = "101-2000-10-102-2000-15"
let strArray = myString.match(/[^-]+-[^-]+-[^-]+/g);
console.log(strArray);
let compartmentMap = new Map(strArray.map(x => x.split("-")));
console.log(compartmentMap);

Мой ввод: "101-2000-10-102-2000-15" Желаемый вывод: {101 => {2000,10}, 102 => {2000,15 }}

Ответы [ 5 ]

3 голосов
/ 17 февраля 2020

Я думаю, что я был бы довольно пешеходом по этому поводу:

const result = new Map();
const rex = /(\d+)-(\d+)-(\d+)/g;
let match;
while ((match = rex.exec(myString)) !== null) {
    result.set(match[1], [match[2], match[3]]);
}

Это предполагает, что вы хотите, чтобы часть 2000, 10 была массивом.

Live Пример:

const myString = "101-2000-10-102-2000-15"
const result = new Map();
const rex = /(\d+)-(\d+)-(\d+)/g;
let match;
while ((match = rex.exec(myString)) !== null) {
    result.set(match[1], [match[2], match[3]]);
}
console.log([...result.entries()]);

Или с более значимыми именами через именованные группы захвата и деструктуризацию:

const result = new Map();
const rex = /(?<key>\d+)-(?<value1>\d+)-(?<value2>\d+)/g;
let match;
while ((match = rex.exec(myString)) !== null) {
    const {key, value1, value2} = match.groups;
    result.set(key, [value1, value2]);
}

Live Пример:

const myString = "101-2000-10-102-2000-15"
const result = new Map();
const rex = /(?<key>\d+)-(?<value1>\d+)-(?<value2>\d+)/g;
let match;
while ((match = rex.exec(myString)) !== null) {
    const {key, value1, value2} = match.groups;
    result.set(key, [value1, value2]);
}
console.log([...result.entries()]);

Или с новым matchAll и деструктуризацией:

const rex = /(\d+)-(\d+)-(\d+)/g;
const result = new Map(
    [...myString.matchAll(rex)].map(
        ([, key, value1, value2]) => [key, [value1, value2]]
    )
);

Live Пример:

const myString = "101-2000-10-102-2000-15"
const rex = /(\d+)-(\d+)-(\d+)/g;
const result = new Map(
    [...myString.matchAll(rex)].map(
        ([, key, value1, value2]) => [key, [value1, value2]]
    )
);
console.log([...result.entries()]);
3 голосов
/ 17 февраля 2020

Вам также нужно получить массив значений.

let myString = "101-2000-10-102-2000-15"
let strArray = myString.match(/[^-]+-[^-]+-[^-]+/g);
console.log(strArray);
let compartmentMap = new Map(strArray.map(x => {
    const [k, ...v] = x.split("-");
    return [k, v];
}));

console.log(Array.from(compartmentMap));
0 голосов
/ 18 февраля 2020

На самом деле, я понял, что лучше выдает карту с точными парами ключ-значение. Все, что мне нужно, это передать ей карту и мой массив, и она выплевывает карту с ключами-значениями.

const myString = '101-2000-10-102-2000-15';
let strArray = myString.match(/[^-]+-[^-]+-[^-]+/g);
console.log(strArray);
const compartmentMap = (someMap, someArray) => (someArray.map(x => { console.log(x)
const [a, b, c] = x.split("-");
someMap.set(a, {b,c});
}));
const x = new Map();
compartmentMap(x, strArray);
console.log(x);
0 голосов
/ 17 февраля 2020

Незначительные изменения в вашем коде, используйте reduce вместо map.

let myString = "101-2000-10-102-2000-15";
let strArray = myString.match(/[^-]+-[^-]+-[^-]+/g);
console.log(strArray);
let compartmentMap = strArray.reduce((acc, curr) => {
  const [a, b, c] = curr.split("-");
  return Object.assign(acc, { [a]: [b, c] });
}, {});
console.log(compartmentMap);
0 голосов
/ 17 февраля 2020

Один из подходов состоит в том, чтобы просто разбить строку, а затем выполнить операцию reduce() для каждых трех элементов:

const s = '101-2000-10-102-2000-15';

const result = s.split('-').reduce((r, v, i, a) =>
    i % 3 ? r : {...r, [v]: a.slice(i + 1, i + 3)}, {});

console.log(result);
...