[英]How to remove duplicates from array in javascript
我已經為好的搜索添加了總稱,但是我的問題更加具體了。
我有一個數組:
var keywords= ["Anglo-Saxon English","American English","British English","Canadian English","Fast British English","Austrian German","American Football","British English","Fast British English","Blue Jeep","Hot Summer","Mild Summer","Hot Brazilian Summer"];
和另一個數組:
var terms = ["english","english","english","english","english","german","football","british english","british english","jeep","summer","summer","summer"];
每個關鍵字對應於每個術語,因為每個關鍵字本身都包含各自的術語。 例如,“ Anglo-Saxon English”關鍵字對應於“ english”一詞,“ American Football”關鍵字對應於“ football”一詞,等等。但是,在關鍵字數組中有一些重復項。 在此示例中,重復的關鍵字為:對應於“英語”術語和“英式英語”術語的“英式英語”關鍵字,對應於“英語”術語以及“英式英語”術語的“快速英式英語”關鍵字。 可以有任意數量的重復項(為簡單起見,我放置了2個)。 所有關鍵字在數組中的排序順序都相同,因此兩個數組的長度相同。
我的問題是,如何在重復項中只留下一個更具體的對應詞? 例如,“英式英語”比“英式”更具體,因此我想從兩個數組中刪除“英式英語”(關鍵字[2])重復關鍵字及其相應的術語“英式”(terms [2]),並且僅保留帶有術語“英國英語”(terms [7])的“英國英語”(關鍵字[7])關鍵字。
更新:通過下面的Tobos提供的解決方案,我想到了一個有效的提琴: http : //jsfiddle.net/ZqEhQ/ 。 但是,這里的“快速英式英語”和“英式英語”仍然被“語言”所代替,而不是被“汽車”類別所吸引,后者具有更具體的“英式英語”一詞,而不僅僅是“英語”一詞。 '類別。 有任何想法嗎?
讓項目以彼此不同的順序依賴於不同的數組通常是一個壞主意,因為它很難維護。 我建議對您的數據使用其他結構:
var data= [
{ keyword : "Anglo-Saxon English", term : 'english', category : 'Language' },
{ keyword : "American English", term : 'english', category : 'Language' },
{ keyword : "Fast British English", term : 'english', category : 'Sport' },
{ keyword : "British English", term : 'english', category : 'Language' },
{ keyword : "British English", term : 'british english', category : 'Language' },
{ keyword : "Fast British English", term : 'british english', category : 'Sport' },
{ keyword : "Canadian English", term : 'french', category : 'Sport' }
];
由於您的最終數據包含唯一關鍵字,因此我將使用數據的另一種結構來保存它:
預期產量:
var uniques = {
"American English": "english"
"Anglo-Saxon English": "english"
"British English": "british english"
"Canadian English": "french"
"Fast British English": "british english"
}
從輸入到預期輸出的某種方式:
var uniques = {};
data.forEach(function(item){
if (isMoreSpecific(item.term, uniques[item.keyword])) {
uniques [item.keyword] = item.term;
}
});
function isMoreSpecific(term, reference) {
return !reference || term.indexOf(reference) !== -1;
}
如果您不同意我的定義或定義特異性的邏輯發生變化,則可以明顯地更改isMoreSpecific
函數。 您甚至可以內聯它,盡管在這種情況下我更喜歡此功能。
注意:上面的解決方案可以很容易地調整為與您最初擁有的兩個陣列一起使用。 只需使用for循環遍歷一個數組來構建uniques
對象,然后從中重建數組即可。
關鍵字包含類別的解決方案:
var uniques = {};
data.forEach(function(item){
var serialized = JSON.stringify({key:item.keyword, cat:item.category});
if (isMoreSpecific(item.term, uniques[serialized])) {
uniques [serialized] = item.term;
}
});
var keywordcategory = {};
for (var serialized in uniques) {
var obj = JSON.parse(serialized);
keywordcategory[obj.key] = obj.cat;
}
演示: http : //jsbin.com/ODoDIXi/1/edit
如果可以假定同一關鍵字僅屬於一個類別,則無需序列化:
var uniques = {};
data.forEach(function(item){
if (isMoreSpecific(item.term, uniques[item.keyword].term)) {
uniques [item.keyword] = { term : item.term; category : item.category };
}
});
// you can now remove the unnecessary term information from the uniques map and keep just the category:
for (var key in uniques) {
uniques[key] = uniques[key].category;
}
我不確定我是否正確理解,但仍然...
讓我們從這個小功能開始:
function removeLessSpecific(ary) {
return ary.filter(function(x) {
return !ary.some(function(y) {
return x != y && y.indexOf(x) >= 0;
});
});
}
當說
["american football","english","british english","football","german"]
它僅返回更具體或“獨立”的術語
["american football","british english","german"]
現在,讓我們將數組轉換為映射結構:
mapping = {}
keywords.forEach(function(kw, i) {
mapping[kw] = (mapping[kw] || []);
mapping[kw].push(terms[i]);
})
映射將如下所示:
{
"Anglo-Saxon English":["english"],
"American English":["english"],
"British English":["english","british english"], etc
最后,遍歷映射,刪除不太具體的關鍵字並填充新的數組:
newTerms = [], newKw = []
Object.keys(mapping).forEach(function(term) {
var kwords = mapping[term];
removeLessSpecific(kwords).forEach(function(kw) {
newTerms.push(term);
newKw.push(kw);
})
})
順便說一句,您的命名對我來說有些混亂。 在您的示例中,第一個數組必須是“條件”(=專有名稱),第二個數組必須是“關鍵字”。
就像Tibos所說的那樣,您需要重組數據。 有2個數組不好。
var data = [
{keyword: "Anglo-Saxon English", term: 'english'},
{keyword: "British English", term: 'english'},
{keyword: "British English", term: 'british english'},
{keyword: "Fast British English", term: 'british english'},
{keyword: "Canadian English", term: 'french'}
];
添加一個唯一的數據數組:
var uniqueData = [];
步驟1-將所有關鍵字提取到uniqueKeywords
數組中
var uniqueKeywords = [];
data.forEach(function(item) {
//if keyword doesn't already exist, push it
if (uniqueKeywords.indexOf(item.keyword) === -1)
uniqueKeywords.push(item.keyword);
});
步驟2-為每個關鍵字找到所有對應的數據對象,並將僅最相關的一個添加到uniqueData
var extractMostRelevant = function(array){
var mostRelevant = array[0];
array.forEach(function(item){
if(item !== array[0]){
if(item.term.length > mostRelevant.term.length)
mostRelevant = item;
}
});
return mostRelevant;
};
uniqueKeywords.forEach(function(keyword){
var itemsWithCurrentKeyword = [];
data.forEach(function(item){
if(keyword === item.keyword)
itemsWithCurrentKeyword.push(item);
});
var mostRelevant = extractMostRelevant(itemsWithCurrentKeyword);
uniqueData.push(mostRelevant);
});
到這里,您現在有了2個數組: data
和uniqueData
原始數組:[1,3,2,1,4,5,6,4,3,5,6,2,3,4,1,4,6,4,10,3,10,“ a”, “一種”]
刪除了重復項:[1,10,2,3,4,5,6,“ a”]
Array.prototype.removeDuplicates = function (){
var temp=new Array();
this.sort();
for(i=0;i<this.length;i++)
if(this[i]==this[i+1]) {continue}
temp[temp.length]=this[i];
}
return temp;
}
要么
var repeatsArray = ['mike','shibu','shibu','alex'];
var uniqueArray = duplicatesArray.filter(function(elem, pos) {
return duplicatesArray.indexOf(elem) == pos;
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.