2016-11-08 50 views
5

我使用obejcts電子郵件和ID數組,因此我想刪除具有相似ID的重複元素。從Javascript中刪除重複的元素使用Javascript

例子:

var newarray=[ 
    { 
     Email:"[email protected]", 
     ID:"A" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"B" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"A" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"C" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"C" 
    } 
]; 

現在我需要刪除具有ID是common.In我期待最終的數組中的SENCE重複的元素是

var FinalArray=[ 
    { 
     Email:"[email protected]", 
     ID:"A" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"B" 
    }, 
    { 
     Email:"[email protected]", 
     ID:"C" 
    } 
]; 
+0

所有你需要的是簡單地創建一個新的陣列,通過您的原始數組迭代,並填寫新的數組與不重複的項目。當然,您可能希望通過使用對象或Map或其他任何方式來提高性能,但想法是一樣的。 –

+0

對於'ID:''',你期待'test1''',''但''test5''' ID:「C」'。這是否意味着你不關心哪個副本被過濾掉? – pawel

+0

爲什麼'test5 @ gmail.com''而不是''test4 @ gmail.com''? –

回答

5

使用Array.prototype.filter過濾掉的元素和保持重複檢查使用temp陣列

var newarray = [{ 
 
    Email: "[email protected]", 
 
    ID: "A" 
 
}, { 
 
    Email: "[email protected]", 
 
    ID: "B" 
 
}, { 
 
    Email: "[email protected]", 
 
    ID: "A" 
 
}, { 
 
    Email: "[email protected]", 
 
    ID: "C" 
 
}, { 
 
    Email: "[email protected]", 
 
    ID: "C" 
 
}]; 
 
    
 
// Array to keep track of duplicates 
 
var dups = []; 
 
var arr = newarray.filter(function(el) { 
 
    // If it is not a duplicate, return true 
 
    if (dups.indexOf(el.ID) == -1) { 
 
    dups.push(el.ID); 
 
    return true; 
 
    } 
 

 
    return false; 
 
    
 
}); 
 

 
console.log(arr);

+0

感謝無效,它節省了我的時間和生活..... –

2

如果您可以使用Javascript庫(如下劃線或lodash),我建議查看其庫中的_.uniq函數。從lodash:

_.uniq(array, [isSorted=false], [callback=_.identity], [thisArg]) 

在這裏,可以使用如下,

var non_duplidated_data = _.uniq(newarray, 'ID'); 
3

你可以利用哈希表進行過濾。

var newarray = [{ Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "B" }, { Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "C" }, { Email: "[email protected]", ID: "C" }], 
 
    filtered = newarray.filter(function (a) { 
 
     if (!this[a.ID]) { 
 
      this[a.ID] = true; 
 
      return true; 
 
     } 
 
    }, Object.create(null)); 
 

 
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6與Set

var newarray = [{ Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "B" }, { Email: "[email protected]", ID: "A" }, { Email: "[email protected]", ID: "C" }, { Email: "[email protected]", ID: "C" }], 
 
    filtered = newarray.filter((s => a => !s.has(a.ID) && s.add(a.ID))(new Set)); 
 

 
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

偉大的ES6'Set'解決方案! –

1

使用Array.prototype.reduce和哈希表的另一個解決方案 - 見下面演示:

var newarray=[ { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"B" }, { Email:"[email protected]", ID:"A" }, { Email:"[email protected]", ID:"C" }, { Email:"[email protected]", ID:"C" } ]; 
 

 
var result = newarray.reduce(function(hash){ 
 
    return function(prev,curr){ 
 
    !hash[curr.ID] && (hash[curr.ID]=prev.push(curr)); 
 
    return prev; 
 
    }; 
 
}(Object.create(null)),[]); 
 

 
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important;}

+0

@SantoshKhavekar讓我知道(也投票!)如果這個答案幫助你,謝謝! – kukkuz