2015-01-09 27 views
0

我想獲取一個對象數組並做2件事情。在對象中嵌套的重複數組

1.)從數組中刪除重複對象,使用重複項目的名稱創建一個新數組。

原文:

var duplicates = []; 

var objects = [ 
    { 
     name: 'foo', 
     nums: [1,2] 
    }, 
    { 
     name: 'bar', 
     nums: [3,2] 
    }, 
    { 
     name: 'baz', 
     nums: [1,2] 
    }, 
    { 
     name: 'bum', 
     nums: [2,3] 
    }, 
    { 
     name: 'bam', 
     nums: [1,2] 
    }, 
] 

所需的輸出:

duplicates = ['foo', 'baz', 'bam']; 

objects = [ 
    { 
     name: 'bar', 
     nums: [3,2] 
    }, 
    { 
     name: 'bum', 
     nums: [2,3] 
    } 
] 

任何人都可以在這方面幫助?我在我的項目中使用lodash。

+0

如果你有'[1,2]'和'[3,4]'的重複項呢?他們都進入「重複」? – Barmar

+3

請顯示您嘗試的內容,以便我們幫助您解決問題。 SO不是免費的編碼服務。 – Barmar

+0

當你說'重複'時,你的意思是數組是相同的對象,還是數組的長度和順序相同,或者長度相同,但是沒有順序的項目? – Xotic750

回答

1

如果nums陣列事項要素的順序:

_.pluck(_.flatten(_.filter(_.groupBy(objects, "nums"), function(el) { 
    return (el.length !== 1) 
})), "name") 

還是有點整潔

var hmap = _(objects).groupBy("nums").values(); 
var unique = hmap.where({'length': 1}).flatten().value(); 
var duplicates = hmap.flatten().difference(unique).value(); 
+0

謝謝,這非常接近。但是,您的解決方案假定我知道重複項中「1」的值。在我的現實世界中,我不會知道任何要過濾的值。 –

+0

@ScottyBollinger查看我的編輯 – nullpotent

0

我不知道underscore.js,這裏是如何用簡單的JS做到這一點:

var counts = {}; 
var duplicates = []; 
for (var i = 0; i < objects.length; i++) { 
    var str = JSON.stringify(objects[i].nums); 
    if (str in counts) { 
     counts[str]++; 
    } else { 
     counts[str] = 1; 
    } 
} 
objects = objects.filter(function(val) { 
    if (counts[JSON.stringify(val.nums)] == 1) { 
    return true; 
    } else { 
    duplicates.push(val.name); 
    return false; 
    } 
}); 

DEMO

+0

感謝您的迴應,但它似乎並不工作http://jsbin.com/bekuku/1/edit?js,console –

+0

我修復了這些問題。我只保存了副本中的一個名字。 – Barmar