2014-11-28 12 views
5

Ich möchte ein Array von eindeutigen Objekten, Entfernen von doppelten Objekten, die einige bestimmte Eigenschaftenwerte haben. Beispiel: Im folgenden Code-Snippet haben Ereignis1 und Ereignis2 denselben Titel und denselben Startwert, Ereignis3 und Ereignis4 haben denselben Titel, aber unterschiedliche Startzeiten.jQuery eindeutige Objekte basierend auf bestimmten Objekteigenschaften

Ich möchte event2 aus dem Objekt-Array entfernen (da es denselben Titel und Startwert wie event1 hat), aber nicht event4 (da es nur denselben Titel hat).

Mein Code sieht so aus:

var event1 = {id: 1, title: 'ABC', start: '10'}; 
var event2 = {id: 2, title: 'ABC', start: '10'}; 
var event3 = {id: 3, title: 'DEF', start: '12'}; 
var event4 = {id: 4, title: 'DEF', start: '20'}; 

var a=[]; 
a.push(event1); 
a.push(event2); 
a.push(event3); 
a.push(event4); 


//I tried this, but this code checks for title only. 
var titles = []; 
var b = []; 

$.each(a, function(index, event) { 
    if ($.inArray(event.title, titles) === -1) { 
     titles.push(event.title); 
     b.push(event); 
    } 
}); 

console.log(b); //Gives output as [Object { id=1, title="ABC", start="10"}, Object { id=3, title="DEF", start="12"}] 
// The right output should be: [Object { id=1, title="ABC", start="10"}, Object { id=3, title="DEF", start="12"}, Object { id=3, title="DEF", start="20"}] 

Mein Code oben prüft nur für den Titel. Ich konnte es nicht für zwei verschiedene Eigenschaften arbeiten lassen. Danke für die Hilfe im Voraus.

Antwort

12

Versuchen Sie folgendes:

var event1 = {id: 1, title: 'ABC', start: '10'}; 
var event2 = {id: 2, title: 'ABC', start: '10'}; 
var event3 = {id: 3, title: 'DEF', start: '12'}; 
var event4 = {id: 4, title: 'DEF', start: '20'}; 

var events = [event1, event2, event3, event4]; 

var result = events.reduce(function(memo, e1){ 
    var matches = memo.filter(function(e2){ 
    return e1.title == e2.title && e1.start == e2.start 
    }) 
    if (matches.length == 0) 
    memo.push(e1) 
    return memo; 
}, []) 

console.log(result) 
+0

Wow !! Genau die Antwort, die ich brauchte. Danke für die Hilfe @ Furqan! – Lalu

+0

Es ist eine Schande Filter funktioniert nicht Levitikon

2

Zur Dokumentation, jQuery:

$.each(a, function(index, event) { 
    var events = $.grep(b, function (e) { 
     return event.title === e.title && 
      event.start === e.start; 
    }); 
    if (events.length === 0) { 
     b.push(event); 
    } 
}); 

demo Siehe

+0

Funktioniert wie ein Charme! Danke @dreyescat – Lalu

Verwandte Themen