我遇到了一个相当简单的问题 - 使用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,我只需要保留第一个,然后删除其余的。
答案 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)
答案 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);