如何使查询字符串始终返回数组?

时间:2018-09-25 04:38:20

标签: javascript reactjs query-string

我正在使用查询字符串(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 :(得分:1)

我认为您无能为力。但是,您可以使用三元运算符来减少一些代码。如果query没有任何内容,则以下代码将返回空数组:

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

答案 1 :(得分:1)

  

原因是我需要将此结果输入函数/方法中   使用数组。

我认为更好的解决方案是将功能/方法的默认参数添加为数组,而不是检查查询是array还是undefined

示例

function yourFunction(query = []){
    return query;
}

答案 2 :(得分:0)

通过这种方式,if条件检查查询是否未定义。

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

答案 3 :(得分:0)

您可以执行以下操作:

var filter = [];

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

这样,过滤器将始终是一个数组,并包含查询过滤器(如果提供)。这种模式并不罕见。

答案 4 :(得分:0)

我认为您可以做到:

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

或:

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

答案 5 :(得分:0)

我将初始化一个空查询。假设您的查询以状态存储,然后:

<div class="container">
  <div class="row">
    <% if @products_search.blank? %>
      <%unless @products.blank?%>
        <% @products.each do |product| %>
          <div class="col-sm-8 col-sm-offset-2">
            <%= product.name %><br>
            <%= product.description %><br>
            <%= humanized_money_with_symbol(product.price)%><br>
            <%= link_to "Show Product", product_path(product) %>
          </div>
        <%end%>
      <%else%>
        <h1>No products found!</h1>
      <%end%>     

    <% elsif @products_search.present? %>
      <% @products_search.each do |product| %>
      <div class="col-sm-8 col-sm-offset-2">
        <%= product.name %><br>
        <%= product.description %><br>
        <%= humanized_money_with_symbol(product.price)%><br>
        <%= link_to "Show Product", product_path(product) %>
      </div>
      <%end%>
    <% else %>
      <h1>No products found!</h1>
    <% end %>
  </div>
</div>

或者,只需在状态为空数组的情况下初始化查询即可:

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

现在,仅当查询在处理程序中具有值时,才应设置查询状态:

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

答案 6 :(得分:0)

除了许多现有答案之外,另一个选项是您可以始终将其包装然后过滤掉undefined

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)