【问题标题】:How to make query string always return an array?如何使查询字符串始终返回一个数组?
【发布时间】:2018-09-25 04:38:20
【问题描述】:

我正在使用查询字符串 (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 = [];
}

但这似乎不是最优的。想知道结果是否可以一直是一个数组。

【问题讨论】:

    标签: javascript reactjs query-string


    【解决方案1】:

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

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

    【讨论】:

    • 您编辑的答案与我的完全一样,但发布相同答案的目的是什么?
    • @soroushchehresa,我可以这么说,就像我在你回答之前就使用了三元运算符......更多,没有任何解释代码在做什么答案如何帮助某人!!!
    • 也许这可能是一个理由,但并不令人信服!
    • 此解决方案似乎将数组包装到另一个数组中。我认为因为第一个条件同时满足字符串和数组..所以它将数组包装到另一个数组中。
    • @catandmouse,你是对的。只是想知道,无论如何,query 在修改之前可以是一个数组吗?
    【解决方案2】:

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

    我认为更好的解决方案不是检查查询是arrayundefined,您可以将函数/方法的默认参数添加为数组

    例子

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

    【讨论】:

    • 如果是字符串或整数呢?
    • @vol7ron 不用担心 qs 解析会返回字符串或未定义。
    【解决方案3】:

    我认为你可以这样做:

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

    或:

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

    【讨论】:

      【解决方案4】:

      这样做,if 条件检查查询是否未定义。

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

      【讨论】:

        【解决方案5】:

        你可以这样做:

        var filter = [];
        
        if(query) {
          filter.push(query);
        }
        

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

        【讨论】:

          【解决方案6】:

          我会初始化一个空查询。假设,您的查询存储在 state 中,那么:

          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]})
          }
          

          【讨论】:

            【解决方案7】:

            除了许多现有答案之外,您还可以随时将其包装起来,然后过滤掉undefineds:

            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)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-29
              • 2011-07-17
              相关资源
              最近更新 更多