Вызов значений массива на основе возврата DOM - PullRequest
0 голосов
/ 01 июня 2019

Возвращает строку, основанную на вытащенных элементах dom

У меня есть объект, хранящий месяцы и их индекс (не даты) monthList = {"jan" : "1", "feb" : "2". etc: etc}

Пользователь может напечатать что-то вроде jan или jan, feb, march и я хочу, чтобы строка возвращалась как 1 или 1,2,3 (которую я использую для вызова get в другом месте), но я не смог этого сделать, я пытался использовать все виды сумасшедших циклов безрезультатно, из-за неправильногочтение, чтобы всегда читать последний индекс, если пользователь вводит 1,2,3, что также должно работать.

Введенные значения просто называются с использованием ${document.getElementById('monthInput').value}

User Input Example #1: jan,feb,dec
User Input Output #1: 1,2,12
User Input Example #2: 1,2,5
User Input Output #2: 1,2,5

Какя могу сделать это?

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Я признаю, что не понимаю, почему вы принимаете ввод пользователя в таких странных форматах. Единственный способ преобразовать пользовательский ввод, который не соответствует определенному синтаксису / формату, - это использовать созданную вручную матрицу.

В inputMap ниже вам нужно будет указать каждый пользовательский ввод и строковое значение, на которое оно должно быть переведено:

const inputMap = {
  "jan": "1",
  "feb": "2",
  "march": "3",
  1: "1",
  2: "2",
  3: "3",
  "dec": 12,
  5: "5"
}

const input1 = "jan,feb,dec"
const input2 = "1,2,5"

const mapInput = inputString => inputString.split(",").map(i => inputMap[i]).join(",")

console.log(mapInput(input1))
console.log(mapInput(input2))
0 голосов
/ 01 июня 2019

Вы можете сделать это несколькими способами:

  1. Используя простой for..of цикл
  2. Используя .replace() (сохраняет форматирование исходной строки)
  3. Использование метода отображения (например: .map
  4. Переход за борт с рекурсией + троичные ...

  1. Использование циклов:

const months={jan:"1",feb:"2",mar:"3",apr:"4",may:"5",jun:"6",jul:"7",aug:"8",sep:"9",oct:"10",nov:"11",dec:"12"};

const input = "jan,dec,feb";
const dates = input.split(','); // turn your input into an array

let converted = "";
for(let month of dates) { // loop through each month in dates
  if(month in months) { // check if the month is a key in months
    converted += months[month] +','; // add number version to converted sring
  } else { // if the month isn't in the converted month object, then no need to convert it
    converted += month+','; // add month to (ie the number) to the converted output
  }
}

console.log(converted.slice(0, -1)); // using slice(0, -1) to remove trailing comma
Использование .replace() для сохранения исходного форматирования:

const months={jan:"1",feb:"2",mar:"3",apr:"4",may:"5",jun:"6",jul:"7",aug:"8",sep:"9",oct:"10",nov:"11",dec:"12"};

let input = "jan,   dec,  feb, 5";
const dates = input.split(','); // turn your input into an array

for(let month of dates) {
  month = month.trim();
  if(month in months) {
    input = input.replace(month, months[month]);
  }
}

console.log(input);
Использование map.Здесь функция внутренней стрелки вызывается для каждого month, а затем преобразуется в соответствующее значение в объекте months.Затем мы используем .join(','), чтобы объединить массив значений:

const months={jan:"1",feb:"2",mar:"3",apr:"4",may:"5",jun:"6",jul:"7",aug:"8",sep:"9",oct:"10",nov:"11",dec:"12"};
const input = "jan,dec,feb";

const converted = input.split(',')
                       .map((month) => month in months ? months[month] : month)
                       .join(',');                    
console.log(converted);
Использование рекурсии с троичным оператором:

const months={jan:"1",feb:"2",mar:"3",apr:"4",may:"5",jun:"6",jul:"7",aug:"8",sep:"9",oct:"10",nov:"11",dec:"12"};
const input = "jan,dec,feb";

const res = (f = ([m, ...rest]) => m && m in months ? months[m]+','+f(rest) : m ? m+','+f(rest) : '')(input.split(',')).slice(0,-1);
console.log(res);
0 голосов
/ 01 июня 2019

Согласно этому ответу , вы можете рекурсивно использовать Date, чтобы выполнить это, учитывая ввод months:

months.split(",").map((month) => {
  return (isNaN(month) ? new Date(Date.parse(month +" 1, 2019")).getMonth()+1 : month)
}).join(",")

Эта функция выполняет итерацию для каждой строки кода / числа, используя map, проверяет, является ли данная строка не числом, используя isNaN() в троичном операторе, и, соответственно, возвращает данное число / преобразованный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...