如何使用javascript从URL列表中删除重复的域
我被困在一个相当简单的问题 - 使用javascript从URL列表中删除重复的域。如何使用javascript从URL列表中删除重复的域
这是我目前正在做的: 我有一个名为'list'的数组,其中包含url的列表。我努力提取这些域,并将它们放入一个名为“域”的新数组中。
然后我使用两个for循环遍历整个列表并检查重复的域。如果域匹配,我将重复的拼接出来。但它似乎消除了太多,我很确定我做错了什么。有人可以告诉我我做错了什么,或者建议一个更简单/更好的方法吗?
for (i=0; i<list.length; i++) {
for (j=i+1; j<list.length; j++) {
if (domain[i] == domain[j]) {
console.log('REMOVING:');
console.log(i + '. ' + list2[i]);
console.log(j + '. ' + list2[j]);
console.log(domain[i]);
console.log(domain[j]);
list.splice(j,1);
}
}
}
这不是'如何从数组中删除重复项'问题。由于我有一个URL列表,需要检查并删除,只有重复的“域”。因此,假设我有来自YouTube的4个网址,我只需要保留第一个网址,然后删除其余网址。
您可以让对象处理检查你。
var a = [];
a.push('http://test')
a.push('http://that');
a.push('http://that');
a.push('http://that');
var o = {}
for(var ii = 0; ii < a.length; ii++){
o[a[ii]] = o[a[ii]]
}
var nA = [];
for (var k in o) {
nA.push(k);
}
删除重复的最好方法是使用地图。该示例具有包含一些重复项的URI数组。首先将字符串插入到对象中,然后遍历该对象以创建一个数组。繁荣,没有重复。
function getHostName(url) {
var match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i);
if (match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0) {
return match[2];
}
else {
return null;
}
}
var uris = ["http://foo.org/barbar","http://www.bar.com/foo/bar/bar.html","http://foo.bar/lorem/","http://foo.org","https://bar.bar","http://foo.org","http://bar.bar"];
var urisObj = {};
for(var i = 0;i<uris.length;i++){
urisObj[getHostName(uris[i])] = getHostName(uris[i]);
}
uris = Object.keys(urisObj).map(function(x) { return urisObj[x];});
console.log(uris);
编辑:
使用http://www.primaryobjects.com/2012/11/19/parsing-hostname-and-domain-from-a-url-with-javascript/摆脱字符串的主机名。
我列表中的URL不仅包含域,网页太..像foo.com/page1.html,bar.com/whatever/p1.html。我需要单独检查域中的重复项。 [现在我有两个阵列,一个是完整的URL,一个是单独的域] – user3001859
如果你想用你最初的方式(或者非常相似)来做,而不是上去阵列(使用i++
),那就改为使用数组。如下面的代码,
var list = ["abc", "cba", "abc", "abc", "abc", "abc"];
for (var i = list.length - 1; i >= 0; i--) {
for (var j = i-1; j >= 0; j--) {
if (list[i] == list[j]) {
console.log('REMOVING:');
console.log(i + '. ' + list[i]);
console.log(j + '. ' + list[j]);
console.log(list[i]);
console.log(list[j]);
list.splice(i, 1);
}
}
}
console.log(list);
感谢您的建议.. – user3001859
一般来说,从阵列中删除元素并同时向上是一个可怕的想法。想想看。 :) – Kalman
尝试摆脱domains数组。取而代之的是建立一个已经“已使用”域的地图:
var urls = [
'http://example.org/page-1.html',
'http://example.org/page-2.html',
'http://google.com/search.html',
'http://mozilla.com/foo.html',
];
var domains = {};
var uniqueUrls = urls.filter(function(url) {
// whatever function you're using to parse URLs
var domain = extractDomain(url);
if (domains[domain]) {
// we have seen this domain before, so ignore the URL
return false;
}
// mark domain, retain URL
domains[domain] = true;
return true;
});
console.log(uniqueUrls);
可能的[数组中唯一值]的重复(http:// *。com/questions/1960473/unique-values-in-an-an-array) – koffeinfrei
hi koffeinfrei,我的问题有点不同 - 因为我有两个数组 - 一个带有url列表,另一个带有域。我需要检查域列表中的重复项,并将它们从网址列表中删除。 – user3001859
并永不改变列表,你迭代)) –