如何使用javascript从URL列表中删除重复的域

时间:2016-08-04 18:55:22

标签: javascript

我遇到了一个相当简单的问题 - 使用javascript从网址列表中删除重复的域名。

以下是我目前正在做的事情: 我有一个名为'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个URL,我只需要保留第一个,然后删除其余的。

6 个答案:

答案 0 :(得分:3)

ES5:filter数组,只包括当前项的索引是否等于数组中的索引:

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

ES6:使用Set

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

或者如果您不能使用点差运算符:

new Set(list).toJSON()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您能够使用Undescore.js库,那就像

一样简单
yourArray = _.uniq(yourArray);

http://underscorejs.org/#uniq

答案 3 :(得分:0)

删除重复项的最佳方法是使用地图。该示例具有一组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/从字符串中获取主机名。

答案 4 :(得分:0)

如果你想用你原来的方式(或者非常类似)来做,而不是上升数组(用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);

答案 5 :(得分:0)

尝试摆脱domains数组。而是建立一个已经使用过的&#34;域:

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