JavaScript 如何将多数组对象转换为查询字符串参数

How to Turn a Multiple Array Object into Query String Parameters in JavaScript

我在下面有多个数组的对象。

{
  "services": [
    {
      "id": "100",
      "name": "PIX"
    },
    {
      "id": "200",
      "name": "Rendimentos"
    }
  ],
  "channels": [
    {
      "id": "300",
      "name": "Chat"
    }
  ]
}

想法是生成查询字符串,类似的东西。

服务=100&服务=200&频道=300

我知道你可以用 map 和 join 来做,但我会知道它是否是一个纯对象,现在下面这个格式,我很困惑

您可以使用 URLSearchParams() API.

迭代您的数据并附加 key/value 对或映射一个条目数组以传递给构造函数

我不知道是什么决定了您从显示的数据中显示的预期输出,因此我使用更简单的数据结构进行演示。

您可以结合 URL() API 来创建完整的 url 字符串,如下所示

const data = [
  {name:'foo', value:10},
  {name:'bar', value:20}
]

// Loop and append key/values
const params = new URLSearchParams();
data.forEach(e => params.append(e.name, e.value));
console.log('params:', params.toString());

// Alternate approach passing entries array to constructor
const params2 = new URLSearchParams(data.map(e => [e.name,e.value]));
console.log('params2:',params2.toString())

//Adding to a URL
const url = new URL('http://example.com')
url.search = params

console.log('Full url:',url)

使用有问题的更新数组数据:

const data={services:[{id:"100",name:"PIX"},{id:"200",name:"Rendimentos"}],channels:[{id:"300",name:"Chat"}]};

const entries = [];
Object.entries(data).forEach(([k,arr])=> arr.forEach(({id}) => entries.push([k,id])));

const params = new URLSearchParams(entries);

const url = new URL('http://example.com')
url.search = params;

console.log(url)

看起来您在尝试使用 map()join() 迭代对象时挂断了,您不能直接这样做。相反,您可以使用 Object.entries 将对象转换为数组并对其进行迭代。因为有一个嵌套的 map() 你可以 flat() 它在 join()

之前

let obj = {
  "services": [{
      "id": "100",
      "name": "PIX"
    },
    {
      "id": "200",
      "name": "Rendimentos"
    }
  ],
  "channels": [{
    "id": "300",
    "name": "Chat"
  }]
}
let queryString = Object.entries(obj).map(s => s[1].map(e => `${s[0]}=${e.id}`)).flat().join('&')
console.log(queryString)