从JavaScript

时间:2018-01-04 18:54:21

标签: javascript

我有一个带有查询字符串的URL,该字符串以特定字母开头和结尾。这是一个例子和我的方法:

假设地址栏中的网址为"http://localhost:3001/build/?videoUrl=bitcoin.vid.com/money#/"

我首先使用window.location.href提取此网址并将其保存在变量x中。

现在,我想首先检查网址中是否存在videoUrl,然后如果它可用,我会拆分网址并提取所需的网址bitcoin.vid.com/money

let x = "http://localhost:3001/build/?videoUrl=bitcoin.vid.com/money#/";
let y;
let result;
if(x.indexOf("?videoUrl")>-1) {
   y = x.split("?videoUrl=");
   result = y[1].split("#")[0];
   console.log("Resultant URL:", result);
}

我觉得我写的整个代码有点麻烦。如果还有更优雅的方式可以让我知道吗?

注意:videoUrl始终不在URL中,因此请检查它是否存在。如果我需要进一步检查,请告诉我吗?

谢谢。
安吉拉

2 个答案:

答案 0 :(得分:11)

您的方法有效,这是主要的 - 但为了更清晰,更健壮的方法,您可以使用内置的JavaScript URL()类。



null




如果您的const getParamFromUrl = (url, param) => (new URL(url)).searchParams.get(param); 参数不存在,那么这只会返回CustomDbContext,您可以相应地处理

如果你想让它更加可重复使用,这里有一个能满足你需要的功能:

SqlServer

在文档中有关于此实现和兼容性的更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/API/URL

答案 1 :(得分:1)

好问题!

整洁解决方案的两个选项:

  • 尝试使用@Lissy建议的URL方法,完成所需内容的功能都是内置的。但是她没有提到corss-browser功能的潜在缺陷
  • Alternativley,我只是使用一个简单的正则表达式,例如/* Output: const T& (struct) const T& (sfinae) const T& (sfinae bad) --- const T& (struct) const T& (sfinae) const T& (sfinae bad) --- T&& (struct) T&& (sfinae) const T& (sfinae bad) --- T&& (struct) T&& (sfinae) const T& (sfinae bad) --- */ #include <iostream> #include <type_traits> using namespace std; struct Value {}; template <typename T> struct greedy_struct { static void run(const T&) { cout << "const T& (struct)" << endl; } static void run(T&&) { cout << "T&& (struct)" << endl; } }; // Per Toby's answer. template <typename T> void greedy_sfinae(const T&) { cout << "const T& (sfinae)" << endl; } template < typename T, typename = std::enable_if_t<std::is_rvalue_reference<T&&>::value>> void greedy_sfinae(T&&) { cout << "T&& (sfinae)" << endl; } // Bad. template <typename T> void greedy_sfinae_bad(const T&) { cout << "const T& (sfinae bad)" << endl; } template < typename T, typename = std::enable_if_t<std::is_rvalue_reference<T>::value>> void greedy_sfinae_bad(T&&) { cout << "T&& (sfinae bad)" << endl; } template <typename TF> void greedy(TF&& value) { using T = std::decay_t<TF>; greedy_struct<T>::run(std::forward<TF>(value)); greedy_sfinae(std::forward<TF>(value)); greedy_sfinae_bad(std::forward<TF>(value)); cout << "---" << endl; } int main() { Value x; const Value y; greedy(x); greedy(y); greedy(Value{}); greedy(std::move(x)); return 0; } - 在我看来,它更简单