从javascript中的查询参数获取对象数组

问题描述 投票:0回答:3

我正在尝试从url查询参数解析数组。网址如下,其中包含在查询参数中指定的emp对象的数组。

http://localhost:8080/list?emp[0].id=21&emp[0].name=john&emp[1].id=22&emp[1].name=tom

有人可以通过解析此类查询参数(可能带有一些ReGEX)并返回如下数组的函数来帮助我)>

[{id:'21',name:'john'},{id:'22',name:'tom'}]

注:

查询参数中可以提及任意数量的emp对象,例如,我刚刚添加了两个。我一直在寻找类似的解决方案,但似乎都没有一个返回在查询参数中使用索引值指定其对象的数组。因此,请不要将问题标记为重复

Edit:我编写了以下函数,该函数可用于获取简单的查询参数,但不适用于上述在查询参数中指定的对象数组。

export const getQueryParamByName = (name, url) => {
    if (!url) url = window.location.href;
    name = name.replace(/[[\]]/g, '\\$&');
    const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');
    const results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, ' '));
}

我正在尝试从url查询参数解析数组。网址如下所示,其中包含在查询参数http:// localhost:8080 / list?emp [0] .id = 21&emp [...

中指定的emp对象数组。

您可以将idname对与以下正则表达式进行匹配:

(emp\[\d+]\.)id=(\d+)&\1name=([^&]+)

demo

然后遍历matchAll()返回的所有此类匹配以构建id名称对象的数组:

matchAll()

我试图创建一个通用函数来处理问题:

const extractObjects = url => {
  const regex = /(emp\[\d+]\.)id=(\d+)&\1name=([^&]+)/g;
  const result = [];
  for (const match of url.matchAll(regex)) {
    result.push({id: match[2], name: match[3]});
  }
  return result;
}

const url = 'http://localhost:8080/list?emp[0].id=21&emp[0].name=john&emp[1].id=22&emp[1].name=tom';
const objects = extractObjects(url);
console.log(objects);

它将从查询字符串创建具有所有属性的对象,提供的示例查询字符串将生成以下对象:

var url = '?person[0].name=Jack&person[0].id=1&person[1].name=Jonathan&note=book';

function removeFirstChar (string) {
  var tmp = string.split('');
  tmp.splice(0 , 1); 
  return tmp.join('');
}

function parse (url) {
  url = removeFirstChar(url);
  var queryParamsArray = url.split('&');

  var object = {};
  for (var i = 0; i < queryParamsArray.length; i++) {
    var queryParamArray = queryParamsArray[i].split('=');
    var re = /\[(\d*)\]/;

    if (re.test(queryParamArray[0])) {
      var reString = /\w+/g;
      var base = (((queryParamArray[0].split('.'))[0]).match(reString))[0];
      var property = (queryParamArray[0].split('.'))[1];

      if (!object[base]) {
        object[base] = [];
      }

      const urlParts = re.exec(queryParamArray[0]);
      const index = urlParts[1];

      if (object[base][index]) {
        object[base][index][property] = queryParamArray[1];
      } else {
        object[base][index] = {
          [property]: queryParamArray[1]
        }
      }
    } else {
      object[queryParamArray[0]] = queryParamArray[1];
    }
  }

  return object;
}

我将分享我的尝试:

{
    person: [
        {
            name: 'Jack',
            id: '1'
        },
        {
            name: 'Jonathan'
        }
    ],
    note: 'book'
}
javascript arrays regex query-parameters
3个回答
0
投票

您可以将idname对与以下正则表达式进行匹配:


0
投票

我试图创建一个通用函数来处理问题:


0
投票

我将分享我的尝试:

© www.soinside.com 2019 - 2024. All rights reserved.