[英]Javascript : Objects with unique key within an array
我有這種形式的對象數組:
[
{ id:"123", url:"example1.com"},
{ id:"123", url:"example2.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
]
我正在尋找一種快速執行的方法來過濾此數組,以僅保留具有唯一ID的對象,在這種情況下,輸出應為:
[
{ id:"123", url:"example1.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
]
我正在使用double for循環比較我的對象,但是在大型陣列上的速度很慢……有人能找到好的解決方案嗎?
看到這個小提琴: http : //jsfiddle.net/afnvqj49/
我只使用一個循環並將已處理的鍵保存在對象中。
var a = [
{ id:"123", url:"example1.com"},
{ id:"123", url:"example2.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
];
var b = [];
var t = {};
for(var i = 0; i < a.length; i++){
if(t[a[i].id]){
continue;
}
t[a[i].id] = true;
b.push(a[i]);
}
console.log(b);
每個ID僅保留第一個條目
var distinct = function(input, keyExtractor){
var seen = {}, result = [];
for(var i = 0, l = input.length; i < l; ++i){
var key = keyExtractor(input[i]);
if(seen.hasOwnProperty(key)) {
continue;
}
result.push(input[i]);
seen[key] = 1;
}
return result;
}
var test = [
{ id:"123", url:"example1.com"},
{ id:"123", url:"example2.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
];
var u = distinct(test, function(a) { return a.id; });
var reserved = [];
var arr = [
{ id:"123", url:"example1.com"},
{ id:"123", url:"example2.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
];
var result = arr.filter(function(item) {
var has = ~reserved.indexOf(item.id);
(!has && reserved.push(item.id));
return !has;
});
您可以使用Array.filter
(請參閱MDN ),類似
var filtered = [
{ id:"123", url:"example1.com"},
{ id:"123", url:"example2.com"},
{ id:"456", url:"example3.com"},
{ id:"789", url:"example4.com"},
].filter( function (v) {
return !this[v.id] ? (this[v.id] = true) : false; },
{});
window.idHolder = []; //its better not to use window object and instead use bind.
var arr = [
{ id:"123", url:"example1.com},
{ id:"123", url:"example2.com},
{ id:"456", url:"example3.com},
{ id:"789", url:"example4.com},
];
var uniqueArr = arr.filter(function(val)
{
if(window.idHolder.indexOf(val.id)!=-1)
{
return false;
}
else
{
window.idHolder.push(val.id);
return true;
}
});
獨特的arr將滿足您的要求
既然有很多好的答案,我只是想把我的樂趣。
使用下划線的groupBy和map方法的單線 。
_.map(_.groupBy(yourarray,function(element) { return element.id }),function(element) { return element[0] });
PD:習慣上在幾個答案都正確的情況下投票否定? 也許我一直在不知不覺中打破SO禮節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.