2017-10-18 1 views
2

Was ist der beste Weg, um Daten aus einem Objekt herauszufiltern?Javascript mit Filter/enthält auf einem Array von Objekten

konnte ich den Code unten tun verwenden, wenn data nur ein Array von Werten war aber jetzt brauche ich keine Daten an filter, wo die item.QID in meinem Array von Objekten besteht.

Daten Obj:

var data = [{ 
    QID: 'ABC123', 
    Name: 'Joe' 
}, 
{ 
QID: 'DEF456', 
Name: 'Bob 
}] 

Snippet:

// I don't want to include data if this QID is in my object 
this.employees = emp.filter(item =>!this.data.includes(item.QID)); 

Von dem, was ich verstehe, includes funktioniert nur auf einem Array, damit ich all die QID Werte behandeln müssen in meinem Objekt als ein Array.

Gewünschtes Ergebnis: (unter der Annahme item.QID = ABC123)

this.employees = emp.filter(item =>!this.data.includes('ABC123')); 

Ergebnis:

var data = [{ 
    QID: 'DEF456', 
    Name: 'Bob' 
}] 

UPDATE: Apologies, ich einige Dinge links ein wenig unklar, die nur versuchen, umfassen notwendige Sachen.

// People Search 
    this.peopleSearchSub = this.typeahead 
     .distinctUntilChanged() 
     .debounceTime(200) 
     .switchMap(term => this._mapsService.loadEmployees(term)) 
     .subscribe(emp => { 
      // Exclude all of the current owners 
      this.employees = emp.filter((item) => item.QID !== this.data.QID); 
     }, (err) => { 
      this.employees = []; 
     }); 

Der obige Code ist, woran ich arbeite. data ist ein Objekt von Benutzern, die ich aus meinen Schnelladressierungsergebnissen ausschließen möchte, indem Sie sie ausfiltern.

+0

Wo ist 'emp' definiert? – guest271314

+0

@ guest271314- Ich habe ein wenig mehr Kontext um was ich weggelassen – SBB

Antwort

0

Versuchen Object#hasOwnProperty()

this.employees = emp.filter(item =>item.hasOwnProperty('QID')); 
+0

OP ist auf einen bestimmten Wert in der Eigenschaft – guest271314

+1

@ guest271314 nicht was gesagt .... * "alle Daten, wo die item.QID existiert" *. Könnte falsch formuliert sein ... war meine Interpretation trotzdem – charlietfl

+1

Zugegeben, obwohl nächste Zeile zu sehen _ "Gewünschtes Ergebnis: (vorausgesetzt' item.QID = ABC123') "_ und erwartetes Ergebnis – guest271314

0

Die Frage ist ein wenig zweideutig, aber mein Verständnis (korrigiert mich wenn ich falsch liege), ist, dass Sie alle Elemente aus einer Liste emp entfernen möchten, die denselben QID haben wie jeder Artikel in einer anderen Liste data?

Wenn das der Fall ist, versuchen Sie:

this.employees = emp.filter(item => !this.data.some(d => d.QID === item.QID)) 

einige ist ein Array-Methode, die true zurückgibt, wenn es Rückruf für jede der Arrays Elemente wahr ist. In diesem Fall wäre some(d => d.QID === item.QID) wahr, wenn eines der Elemente der Liste data die gleiche QID wie item hätte.

0

können Sie einen für verwenden ... in einer Schleife durch und herausfiltern, was Sie wollen:

const data = [{ 
    QID: 'ABC123', 
    Name: 'Joe' 
}, 
{ 
    QID: 'DEF456', 
    Name: 'Bob' 
}] 

let newData  = []; 
let filterValue = 'ABC123'; 

for (let value in data) { 
    if (data[value].QID !== filterValue) { 
    newData.push(data[value]); 
    } 
} 

newData wird Ihre neue gefilterte Array in diesem Fall

0

Sie können eine es6 benutzen. Filter dafür. Ich fügte auch ein paar Elemente hinzu, die die gefilterte Liste und eine Eingabe zeigen, um den gefilterten Wert zu ändern. Diese Liste wird beim Klicken auf die Schaltfläche aktualisiert.

const data = [{ 
 
    QID: 'ABC123', 
 
    Name: 'Joe' 
 
}, 
 
{ 
 
    QID: 'DEF456', 
 
    Name: 'Bob' 
 
}] 
 

 
displayData(data); 
 

 
function displayData(arr) { 
 
    let str = ''; 
 
    document.getElementById('filterList').innerHTML = ''; 
 

 
    arr.forEach((i) => { str += "<li>" + i.QID + ": " + i.Name + "</li>"}) 
 
    document.getElementById('filterList').innerHTML = str; 
 
} 
 

 
function filterData() { 
 
let filterValue = document.getElementById('filterInput').value; 
 
filterText (filterValue); 
 
} 
 

 

 
function filterText (filterValue) { 
 
    let newArr = data.filter((n) => n.QID !== filterValue); 
 
    displayData(newArr) 
 
}
<input id="filterInput" type="text" value="ABC123" /> 
 
<button type ="button" onclick="filterData()">Filter</button> 
 
<hr/> 
 
<ul id="filterList"><ul>

Verwandte Themen