首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将params的对象序列化为url

将params的对象序列化为url
EN

Stack Overflow用户
提问于 2020-06-23 17:49:24
回答 4查看 176关注 0票数 0

我们的输入如下所示

代码语言:javascript
运行
复制
const params = {
  id: 1,
  filters: {
    price: {
      min: 101,
      max: 300
    }
  },
  sorters: {
    sortBy: 'price',
    order: 'desc'
  }
}

我们希望输出像这样的id=1&min=101&max=300&sortBy=price&order=desc

对象是嵌套的。如果我们只有一个级别的对象(对象中没有对象),那么我们可以简单地这样做

代码语言:javascript
运行
复制
for (const [key, value] of Object.entries(object1)) {
  arr.push(`${key}=${value}`);
}

然后可能是带有&.join数组。但在这里,在这种情况下,这是不够的。我的第一个想法是将this for循环放在里面,如下所示:

代码语言:javascript
运行
复制
const paramsStringify = (paramsObject) => {
  const arr = []
  
  for (const [key, value] of Object.entries(paramsObject)) {
    if(typeof value === 'object') {
      for (const [key2, value2] of Object.entries(value)) {
        if(typeof value2 === 'object') {
          for (const [key3, value3] of Object.entries(value2)) {
            console.log('3rd lvl', `${key3}: ${value3}`);
            arr.push(`${key3}=${value3}`)
          }
        } else {
          console.log('2nd lvl', `${key2}: ${value2}`);
          arr.push(`${key2}=${value2}`)
        }
      }
    } else {
      console.log('1st lvl', `${key}: ${value}`);
      arr.push(`${key}=${value}`)
    }
  }
  
  console.log('arr', arr.join('&'))
}

this is working fine但是代码在我看来很糟糕。我嵌套了它三次,如果我有更多的嵌套对象,我就需要在那里放另一个for循环。但每一级对象的模式都是相同的。我能以某种方式重构它,这样即使我有7个嵌套对象的输入,它也能工作吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-23 17:59:23

代码语言:javascript
运行
复制
const params = {
  id: 1,
  filters: {
    price: {
      min: 101,
      max: 300
    }
  },
  sorters: {
    sortBy: 'price',
    order: 'desc'
  }
}

function add(a, o) {
  for (const [key, value] of Object.entries(o)) {
    if (typeof value === 'object') add(a, value); // recursion
    else a.push(`${key}=${value}`); // only if value not-an-object
  }
  return a;
}

console.log(add([], params).join("&"))

这是一个简单的递归版本。如果你想支持更复杂的结构(数组,重复的键,...),你可能不得不调优它。

票数 3
EN

Stack Overflow用户

发布于 2020-06-23 18:01:42

您可以使用URLSearchParams对象并递归地将键值对附加到该对象。这将自动编码值。

代码语言:javascript
运行
复制
const params = {
  id: 1,
  filters: { price: { min: 101, max: 300 } },
  sorters: { sortBy: "price", order: "desc" }
}

function getParam(o, searchParam = new URLSearchParams) {
  Object.entries(o).forEach(([k, v]) => {
    if (v !== null && typeof v === 'object')
      getParam(v, searchParam)
    else
      searchParam.append(k, v)
  })
  
  return searchParam
}

const searchParam = getParam(params);

console.log(
  searchParam.toString()
)

票数 4
EN

Stack Overflow用户

发布于 2020-06-23 18:06:57

假设您的对象与示例一致,请使用URLSearchParams对象,并使用正则表达式避免递归

代码语言:javascript
运行
复制
const params = {
  id: 1,
  filters: {
    price: {
      min: 101,
      max: 300
    }
  },
  sorters: {
    sortBy: 'price',
    order: 'desc'
  }
}

const js = JSON.stringify(params);
const re = /"(\w+)":[^\{]?"?(\w+)"?/g
const usp = new URLSearchParams();
js.match(re).forEach(str => {
  const [key,val] = str.split(":");
  usp.set(key.replace(/"/g,""),val.replace(/"/g,""))
})
console.log(usp.toString())

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62531914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档