【问题标题】:Get array of objects from URLSearchParams从 URLSearchParams 获取对象数组
【发布时间】:2021-10-13 21:13:33
【问题描述】:

我需要从 URL 字符串中提取 filter,它是一个对象数组:

http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u.

这是我目前拥有的:

  const location = useLocation();
  const searchParams = new URLSearchParams(location.search);
  const filterParamsValue = searchParams.getAll('filter'); // returns []

这是我想从filter得到的:

[ { id: 'MenuID', value: '2' }, { id: 'ParentMenuName', value: 'u' } ]

【问题讨论】:

    标签: javascript reactjs ecmascript-6 get react-hooks


    【解决方案1】:

    一些快速运行 :D ...

    let s = `http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u`
    
    // get just array of strings like ['filter[0][id]=MenuID', ...]
    let arr = s.split(/\&/).slice(1)
    let filters = {}
    
    arr.forEach(f => {
        const id = f.match(/\[([\d]+)\]/)[1]
        const prop = f.match(/\[([a-z]+)\]/)[1]
    
        if(filters[id]) {
            filters[id][prop] = f.match(/=([\w]+)/)[1]
        } else {
            filters[id] = {}
            filters[id][prop] = f.match(/=([\w]+)/)[1]
        }
    })
    
    
    // show filters object:
    console.dir( filters )
    
    /*
    
      { 
        0: { id: "MenuID", value: "2"},
        1: { id: "ParentMenuName", value: "u"}
      }
    
    */
    

    这为您提供了过滤器对象。 如果需要数组,可以将其转换为:

    /**
     * get object of filters and make an array of filters 
     */
    const arrayOfFilters = []
    
    for(key in filters) {
        arrayOfFilters.push(filters[key])
    }
    
    console.log(arrayOfFilters)
    

    【讨论】:

    • 很好,但这不适用于以 & 为前缀的其他参数。例如:` let s = "localhost:3006/…" ` 将导致:` Uncaught TypeError: Cannot read property '1' of null at arr.forEach.f (:8:38) at Array.forEach () 在 :7:5 `
    • 是的,它非常脆弱 - 它需要字符串非常一致。我制作它是为了好玩,并向您展示一些您可以使用/开始的代码。问题是..我不知道字符串中可能有哪些不同的选项以及它们的外观;)您需要编写适用于所有这些不同选项的代码。
    【解决方案2】:

    我编写了一个原型函数来解析方括号中的对象数组。 这个函数是动态解析括号,对嵌套对象有好处

    URLSearchParams.prototype.toObject = function () {
        let _obj = {};
        const bracketToDots = function (str) {
            return str.replaceAll('[', '.').replaceAll(']', '')
        }
        const parseDotNotation = function (str, val, obj) {
            let currentObj = obj,
                keys = str.split("."),
                i, l = Math.max(1, keys.length - 1),
                key;
    
            if (l === 1) {
                key = keys[0];
                currentObj[key] = val;
            } else {
                for (i = 0; i < l; ++i) {
                    key = keys[i];
                    currentObj[key] = currentObj[key] || {};
                    currentObj = currentObj[key];
                }
    
                currentObj[keys[i]] = val;
            }
        }
        for (const [key, value] of this.entries()) {
            parseDotNotation(bracketToDots(key), value, _obj);
        }
        return _obj;
    }
    
    const lo = new URL('http://localhost:3006/menus?page=1&filter[0][id]=MenuID&filter[0][value]=2&filter[1][id]=ParentMenuName&filter[1][value]=u');
    const searchParams = new URLSearchParams(lo.search);
    const params = searchParams.toObject();
    
    console.log(params['filter'])

    结果:

    {
      "0": {
        "id": "MenuID",
        "value": "2"
      },
      "1": {
        "id": "ParentMenuName",
        "value": "u"
      }
    }
    

    【讨论】:

    • 干得好,但我可以使用toArray() 功能吗?
    • @MickoMagallanes 是的,你可以编写你想要的函数
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多