Получить параметры как строковый массив, если одно значение - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь передать массив строк в качестве параметра для вызова GET:

// One value
param: filters=Something
value: filters: 'Something'

// Multiple values
param: filters=Something&filters=Something else
value: filters: [ 'Something', 'Something else' ]

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

Я пробовал такие вещи, как Array.from и т. Д., Но затем он просто создает массив из строки:

['S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

Мне нужен способ заставить отдельные значения считываться как массив строк. Есть ли что-то, что можно сделать?

Edit:

Я получил запрос, мне нужны значения фильтра, чтобы отфильтровать результаты и отправить их обратно. Когда в параметре фильтра есть одно значение, оно видит его как строку и разбивает его на части. Мне нужно / хочу, чтобы это был один массив с одним строковым значением.

1 Ответ

0 голосов
/ 08 января 2019

В комментарии вы сказали:

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

Вы перебираете параметры строки запроса и строите массив по мере необходимости, если вы уже видели этот параметр хотя бы один раз ранее:

function getParameters(query)/*: Map<String,String> */ {
  const m = new Map/*<String,String>*/();
  for (const part of query.split("&")) {
    let [key, value] = part.split("=");
    key = decodeURIComponent(key); // People commonly miss out this bit
    vale = decodeURIComponent(value);
    if (m.has(key)) {
      let current = m.get(key);
      if (Array.isArray(current)) {
        current.push(value);
      } else {
        m.set(key, [current, value]);
      }
    } else {
      m.set(key, value);
    }
  }
  return m;
}

const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";

console.log("query1's params:", [...getParameters(query1).entries()]);

console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
  max-height: 100% !important;
}

С другой стороны, если вы всегда хотите получить массив для определенного параметра, вы проверяете ключ и ветвь в этом случае:

const arrayParams = Object.assign(Object.create(null), {
  filters: true
});
function getParameters(query)/*: Map<String,String> */ {
  const m = new Map/*<String,String>*/();
  for (const part of query.split("&")) {
    let [key, value] = part.split("=");
    key = decodeURIComponent(key); // People commonly miss out this bit
    vale = decodeURIComponent(value);
    if (arrayParams[key]) {
      // Array parameter
      if (m.has(key)) {
        m.get(key).push(value);
      } else {
        m.set(key, [value]);
      }
    } else {
      // Non-array parameter, may or may not have multiple values (or maybe you take the last, etc.)
      if (m.has(key)) {
        let current = m.get(key);
        if (Array.isArray(current)) {
          current.push(value);
        } else {
          m.set(key, [current, value]);
        }
      } else {
        m.set(key, value);
      }
    }
  }
  return m;
}

const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";

console.log("query1's params:", [...getParameters(query1).entries()]);

console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
  max-height: 100% !important;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...