JavaScript数组。包括返回false(比较链接数组中的用户输入)
我想做一个函数- 获取页面上的所有链接,将这些链接与用户输入的链接进行比较,并检查页面上是否已经存在该链接 似乎我可以从输入框中获取值,并将链接转换为数组。但是,即使我匹配了这些值(例如,.includes函数),它也会不断返回false 我已尝试将数组转换为字符串。这是可行的,但它比较了一切,而不是具体的链接。(例如,即使我只是在输入框中输入“h”,它也会说存在重复链接。)JavaScript数组。包括返回false(比较链接数组中的用户输入),javascript,arrays,Javascript,Arrays,我想做一个函数- 获取页面上的所有链接,将这些链接与用户输入的链接进行比较,并检查页面上是否已经存在该链接 似乎我可以从输入框中获取值,并将链接转换为数组。但是,即使我匹配了这些值(例如,.includes函数),它也会不断返回false 我已尝试将数组转换为字符串。这是可行的,但它比较了一切,而不是具体的链接。(例如,即使我只是在输入框中输入“h”,它也会说存在重复链接。) 网址: 0 函数grabLinks(){ //从输入获取URL var URL=document.getElement
网址:
0
函数grabLinks(){
//从输入获取URL
var URL=document.getElementById('URL')。值;
//获取所有链接
var links=document.querySelectorAll('a');
//将节点列表转换为数组
var linksArr=Array.from(links);
//将链接与数组进行比较
var compareArr=linksArr.includes(URL);
警报(URL);
警报(linksArr);
警惕(比较耳环);
如果(比较耳环===真){
警报(“重复”);
}
否则{
警报(“NoDuplicate”);
}
};
预期结果将是用户在输入框中键入“”。然后comparear将返回true
如果他们输入的链接不在页面上,compareArr将返回false
实际结果是它总是返回false
我添加警报只是为了调试。您需要在该数组中循环,以便将每个元素与数组进行比较。失败的原因是,
array.from(document.querySelectorAll('a'))
将为您提供一个节点列表数组,但它不会为您提供链接
您需要提取href
值,然后进行比较,以实现您想要的
编辑:我对您的代码做了一些基本的更改,您可以验证它是否有效
网址:
0
函数grabLinks(){
//从输入获取URL
var URL=document.getElementById('URL')。值;
//获取所有链接
var links=document.querySelectorAll('a');
//将节点列表转换为数组
var linksArr=Array.from(links);
//将链接与数组进行比较
const res=linksArr.filter(link=>link.href.includes(URL));
如果(相对长度){
警报(“重复”);
}
否则{
警报(“NoDuplicate”);
}
};
linksArr实际上仍然是一个对象数组。使用
抓住你想要的东西。在这种情况下,可能是href
更新代码:
//Convert Nodelist to array of objects
var linksArr = Array.from(links);
// Convert object array to string array
var newLinksArr = linksArr.map(nodeObject => nodeObject.href)
console.log(newLinksArr)
// ['http://www.test.com', 'https://stackoverflow.com', 'https://www.ford.com']
您的
linksArr
是一个s数组,您可以将其与字符串进行比较。它们是不同的类型,所以它们永远不会匹配。您可以使用查找数组中的第一个匹配元素,或者如果您只想知道它是否存在于列表中,也可以使用
函数抓取链接(){
var url=document.getElementById('url')。值;
var links=document.querySelectorAll('a');
//将节点列表转换为数组
var linksArr=Array.from(links);
//将链接与数组进行比较
var compareArr=linksArr.some(a=>a.href==url);
如果(比较耳环===真){
console.log('Duplicate');
}否则{
console.log('NoDuplicate');
}
};代码>
URL:
0
当您使用
var links = document.querySelectorAll('a');
您正在链接中获取HtmleElements对象
因此,在转换为数组的过程中,您可以从这些HtmleElement对象中提取链接
var linksArr = Array.from(links).map(link => link.href);
linksArr中的链接也会有一个尾随“/”。所以在比较中使用耳环
var compareArr = linksArr.includes(URL + "/");
或者,无论何时使用.includes()
都可以从linksArr中的所有链接中删除此尾随“/”,然后确保数组的格式为
const array = [1, 2, 3];
console.log(array.includes(1); // true
在上述情况下,您将得到true
如果您的数组是这样的对象形式
const array = [{ id:1 }, { id:2 }];
console.log(array.includes(1); // false
然后.includes()
不起作用,总是给你false
。因此,请确保您使用的是哪种数组格式,并根据您的要求对其应用适当的方法。您需要从NodeList对象links中的每个节点获取href
使用forEach迭代链接并创建一个href数组
下面的解决方案效果很好
<!DOCTYPE html>
<html>
<head>
</head>
<body>
URL: <input id="URL" type="text" name="URL"><br>
<input onClick="grabLinks()" type="submit" value="Submit">
<div id="dupliURLNum">0</div>
<script>
function grabLinks() {
//Get URL from input
var URL = document.getElementById('URL').value;
//Get all links
var links = document.querySelectorAll('a');
//Convert Nodelist to Array
var linksArr = [];
links.forEach(node => linksArr.push(node.href))
//Compare Link to Array
var compareArr = linksArr.includes(URL);
alert(URL);
alert(linksArr);
alert(compareArr);
if (compareArr === true) {
alert('Duplicate');
}
else {
alert('NoDuplicate');
}
};
</script>
<a href="http://www.test.com">test</a>
<a href="https://stackoverflow.com">stackoverflow</a>
<a href="https://www.ford.com">ford</a>
</body>
</html>
网址:
0
函数grabLinks(){
//从输入获取URL
var URL=document.getElementById('URL')。值;
//获取所有链接
var links=document.querySelectorAll('a');
//将节点列表转换为数组
var linksArr=[];
links.forEach(node=>linksArr.push(node.href))
//将链接与数组进行比较
var compareArr=linksArr.includes(URL);
警报(URL);
警报(linksArr);
警惕(比较耳环);
如果(比较耳环===真){
警报(“重复”);
}
否则{
警报(“NoDuplicate”);
}
};
您确定var linksArr=Array.from(links)
将所有a
元素转换为准备好进行比较的URL?ahtmlinklement
不是字符串!它们永远不可能是=
(这是Array#包括的所做的比较)。最好做linksArr.some(a=>a.href==URL)代码>这就是数组。原型。包含的功能。不,不是。Array.includes将仅验证数组中是否存在直接值。在这种情况下,它不是!完美的我知道我一定没有正确地获取HREF。我还添加了var compareArr=linksArr.includes(URL+“/”);从Abitos post开始处理尾部/。谢谢大家@timothybeachboard很高兴提供帮助,如果此答案解决了您的问题,请单击答案旁边的复选标记将其标记为已接受。请看:接受答案是如何工作的?更多信息。再次感谢您!这是我第一次发帖。=)
<!DOCTYPE html>
<html>
<head>
</head>
<body>
URL: <input id="URL" type="text" name="URL"><br>
<input onClick="grabLinks()" type="submit" value="Submit">
<div id="dupliURLNum">0</div>
<script>
function grabLinks() {
//Get URL from input
var URL = document.getElementById('URL').value;
//Get all links
var links = document.querySelectorAll('a');
//Convert Nodelist to Array
var linksArr = [];
links.forEach(node => linksArr.push(node.href))
//Compare Link to Array
var compareArr = linksArr.includes(URL);
alert(URL);
alert(linksArr);
alert(compareArr);
if (compareArr === true) {
alert('Duplicate');
}
else {
alert('NoDuplicate');
}
};
</script>
<a href="http://www.test.com">test</a>
<a href="https://stackoverflow.com">stackoverflow</a>
<a href="https://www.ford.com">ford</a>
</body>
</html>