Строковые элементы и значения ключей объекта - PullRequest
1 голос
/ 16 марта 2020

Спасибо за чтение .

Допустим, у меня есть этот набор входных данных:

const S = "1C 5A 10F 1F 5E"; //Int are rows and Char are columns (ie. seat in a movie theater)
const N = 10; // Number between 1 to 100000
const Ob = { "A": 1, "B": 2, "C": 3,"D": 5, "E": 7, "F": 11, "G": 13,"H": 17, "J": 19, "K": 23};

Я хочу создать размер массива N, где:

  • Int значение минус 1 - это позиция в массиве.

  • Char используется для получения значения в Ob и добавил его в массив в позиции соответствующего Int.

  • Если значение Int повторяется (значение в той же строке), значение в массиве этой позиции следует умножить предыдущее значение на новое значение символа в Ob.

Например (с учетом приведенных выше значений):

  • Значение 1C из S должно выделять значение C из Ob в позиции 0 массива, так что
A[0] === 3;
  • Если мы сделаем это для всех входов выше, результат должен быть
A = [33, 0, 0, 7, 0, 0, 0, 0, 0, 11]

Мне удалось сделать это с кодом ниже

//Resulting Array
A = Array(N).fill(0)

//Get string Int and Char into two arrays
let Columns = S.replace(/\d/g,'').split(' ');
let Rows = S.replace(/[A-K]/g,'').split(' ').map(Number);

//Replace values in A based on Rows and Columns values
Rows.forEach((value,i) => {A[value - 1] === 0 ? arrA[value - 1] = Ob[Columns[i]] : A[value - 1] = Ob[Columns[i]] * A[value - 1]});

Но я уверен, что должен быть более эффективный способ зацикливания только один раз (char до char) в S , Что-то вроде кода ниже. Моя основная проблема заключается в управлении количеством цифр Int (ie. 1, 10, 100, 1000, 10000 и т. Д. c.) При использовании пробела в качестве разделителей при циклической обработке строки на символ.

A = [...S].forEach(char => {});

Спасибо за помощь.

1 Ответ

0 голосов
/ 17 марта 2020

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

const
    data = "1C 5A 10F 1F 5E",
    length = 10,
    object = { "A": 1, "B": 2, "C": 3, "D": 5, "E": 7, "F": 11, "G": 13, "H": 17, "J": 19, "K": 23 },
    result = data
        .split(' ')
        .reduce(
            (r, position) => {
                var  [i, key] = position.match(/\d+|\D/g);
                i--;
                r[i] = (r[i] || 1) * object[key];
                return r;
            },
            Array.from({ length }, _ => 0)
        );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...