首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何循环URLSearchParams?

如何循环URLSearchParams?
EN

Stack Overflow用户
提问于 2021-09-15 22:38:45
回答 1查看 1.7K关注 0票数 1

我试过这两种选择,但没有任何结果:

代码语言:javascript
复制
let url = new URL(window.location.href);
let key = undefined;

for (let k of url.searchParams) {
    if(url.searchParams[k] == postID) {
        key = k;
    }
}

代码语言:javascript
复制
let url = new URL(window.location.href);
const filteredItems = Object.keys(url.searchParams).filter(key =>
  url.searchParams[key] == postID
);
let key = filteredItems.keys.first;

怎么啦?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-15 22:54:44

两个问题:

  1. 虽然URLSearchParams具有迭代器语义(即Symbol.iterator属性),但访问键不是通过正常的属性访问,而是通过get方法:url.searchParams.get("someKey") === postID执行。
  2. URLSearchParams的迭代器协议以[ key, value ]数组的形式返回元素,而不仅仅是密钥本身,因此在for-of循环中,url.searchParams[k] == postID就像url.searchParams[[ "someKey", "somePostId" ]] == postID,这将被胁迫到url.searchParams["someKey,somePostId"] == postID

查找值与postID匹配的键(或键)的工作方法如下所示:

代码语言:javascript
复制
const searchParams = new URL(window.location.href).searchParams;
// const searchParams = new URLSearchParams(location.search); // Alternative.

const keyCandidates = Array.from(searchParams)
    .filter(([ key, value ]) => value === postID)
    .map(([ key ]) => key);
const keyCandidate = Array.from(searchParams)
    .find(([ key, value ]) => value === postID)[0];
const lastKeyCandidate = Array.from(searchParams)
    .reverse()
    .find(([ key, value ]) => value === postID)[0];

console.log("List of candidate keys: ", keyCandidates);
console.log("Single candidate key: ", keyCandidate);

如果您所处的环境支持爱尔兰人帮手,则可以将其重写为:

代码语言:javascript
复制
const keyCandidates = searchParams.entries()
    .filter(([ key, value ]) => value === postID)
    .map(([ key ]) => key)
    .toArray();
const keyCandidate = searchParams.entries()
    .find(([ key, value ]) => value === postID)[0];

lastKeyCandidate在未来可能与双端爱尔兰人提案有一个简单的等价关系。

代码语言:javascript
复制
const lastKeyCandidate = searchParams.entries()
    .filter(([ key, value ]) => value === "1")
    .map(([ key ]) => key)
    .next("back") // Get last entry in iterator.
    .value;

更多的迭代示例:

代码语言:javascript
复制
const url = "https://example.com/?some=value&search=1&param=&etc";

// Equivalent to `new URL(url).search`.
const urlSearch = "?some=value&search=1&param=&etc";

// Equivalent to `new URLSearchParams(urlSearch)`.
const searchParams = new URL(url).searchParams;

// Equivalent to `Array.from(searchParams.entries())`
console.log(Array.from(searchParams));
// Result: [ [ "some", "value" ], [ "search", "1" ], [ "param", "" ], [ "etc", "" ] ]

// Equivalent to `new Map(searchParams.entries())`
console.log(new Map(searchParams));
// Result: Map { "some" → "value", "search" → "1", "param" → "", "etc" → "" }

console.log(Array.from(searchParams.keys()));
// Result: [ "some", "search", "param", "etc" ]

console.log(Array.from(searchParams.values()));
// Result: [ "value", "1", "", "" ]

for(const [ key, value ] of searchParams){
  console.log(key, value); // "some", "value"; then "search", "1"; then "param", ""; then "etc", "".
}

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

https://stackoverflow.com/questions/69200486

复制
相关文章

相似问题

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