Как сделать так, чтобы строка запроса всегда возвращала массив? - PullRequest
0 голосов
/ 25 сентября 2018

Я использую строку запроса (https://www.npmjs.com/package/qs) для разбора параметров в URL-адресе следующим образом:

http://www.website.com/?filter="bags"&filter="shirts"

Однако, если у меня нет фильтра или только одинфильтр возвращает либо строку, либо неопределенную:

http://www.website.com/?filter="bags" // returns 'bags'
http://www.website.com/ // returns undefined

Причина в том, что мне нужно передать этот результат в функции / методы, использующие массив.

Одно из решений, о котором я подумал, - этосвоего рода условие создания в зависимости от того, что оно возвращает:

if (typeof query == 'string') {
    query = [query];
} else if (query == undefined) {
    query = [];
}

Но это кажется неоптимальным. Интересно, может ли результат быть просто массивом все время.

Ответы [ 7 ]

0 голосов
/ 25 сентября 2018

Я бы инициализировал пустой запрос.Предположим, ваш запрос хранится в состоянии, затем:

const { query } = this.state || { query: [] }

Или просто инициализируйте запрос с пустым массивом в состоянии:

state = {
  query: [] // rather than ''
}

Теперь вам нужно только установить запроссостояние, когда оно имеет значение внутри вашего обработчика:

const query = e.target.value // or whatever the source you get the query from
if(query) {
  this.setState({query: [query]})
}
0 голосов
/ 25 сентября 2018

В дополнение ко многим существующим ответам есть еще один вариант: вы всегда можете обернуть его, а затем отфильтровать undefined s:

let str = 'str';
console.log( [str].filter(v=>v!==undefined) )   // [ 'str' ]

let undf;
console.log( [undf].filter(v=>v!==undefined) )  // [ ]

// Example: filter out undefined
query = [query].filter(v=>v!==undefined)

// Example: passing in a Boolean constructor, since non-empty strings are truthy
query = [query].filter(Boolean)
0 голосов
/ 25 сентября 2018

Причина в том, что мне нужно передать этот результат в функции / методы, которые используют массив.

Я думаю, что лучшее решение вместо проверки запроса - array или * 1006.*, вы можете добавить параметр функции / метода по умолчанию в массив

пример

function yourFunction(query = []){
    return query;
}
0 голосов
/ 25 сентября 2018

Я думаю, вы могли бы сделать:

query = !!query ? Array.isArray(query) ? query : [query] : [];

или:

if(!!query) {
  if(!Array.isArray(query)) {
    query = [query];
  }
} else {
  query = [];
}
0 голосов
/ 25 сентября 2018

Вы можете сделать что-то вроде этого:

var filter = [];

if(query) {
  filter.push(query);
}

Таким образом, фильтр всегда будет массивом и будет содержать фильтры запросов, если они предусмотрены.Этот образец не редкость.

0 голосов
/ 25 сентября 2018

Я думаю, что вы ничего не можете сделать.Тем не менее, вы можете использовать троичный оператор для сокращения кода.Следующий код вернет пустой массив, если у query ничего нет:

if(!Array.isArray(query))
  query = !!query ? [query] : [];
0 голосов
/ 25 сентября 2018

Сделайте так, if запрос проверки условий не определен или нет.

if (query) {
   query = [query];
} else {
   query = [];
}
...