如何使用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个网址,我只需要保留第一个网址,然后删除其余网址。

+1

可能的[数组中唯一值]的重复(http:// *。com/questions/1960473/unique-values-in-an-an-array) – koffeinfrei

+0

hi koffeinfrei,我的问题有点不同 - 因为我有两个数组 - 一个带有url列表,另一个带有域。我需要检查域列表中的重复项,并将它们从网址列表中删除。 – user3001859

+0

并永不改变列表,你迭代)) –

ES5:filter数组,只包括如果当前项目的索引等于其在数组中的索引:

list.filter(function(elem, pos, arr) { 
    return arr.indexOf(elem) === pos; 
}); 

ES6:使用Set

const uniqueDomains = [ ...new Set(list) ]; 

,或者如果你可以” t使用展开运算符:

new Set(list).toJSON() 

您可以让对象处理检查你。

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); 
} 

如果你能够使用Undescore.js库,它是那样简单

yourArray = _.uniq(yourArray); 

http://underscorejs.org/#uniq

删除重复的最好方法是使用地图。该示例具有包含一些重复项的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/摆脱字符串的主机名。

+0

我列表中的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); 
+0

感谢您的建议.. – user3001859

+0

一般来说,从阵列中删除元素并同时向上是一个可怕的想法。想想看。 :) – 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);