2017-06-20 2 views
0

Ich versuche, ein Array mit mehr als einem Filter zu filtern. Aber bisher ist es mir nicht gelungen, das zu bekommen, was ich erwarte.filter mutidimensional Array mit typeScript

das ist meine Komponente Angular

list = [ {type: type1, code: code1}, {type: type2, code: code2}] 

searchElement(code?: string, type?: string){ 
var myVar = this.list 

if(type) 
myVar = myVar.filter(elt => elt.type.indexOf(type) > -1); 

if(code) 
myVar = myVar.filter(elt => elt.type.indexOf(code) > -1); 

//call another function myFunction() with the filtered array myVar 
} 

Wegen des asynchronen Verhaltens myFunction() aufgerufen wird, bevor meineVar gefiltert wird. Wie kann ich sicherstellen, dass myVar gefiltert wird, bevor Sie myFunction() aufrufen?

+1

Wenn um Hilfe zu bitten, stellen Sie sicher,/indent zu formatieren Sie den Code in einem vernünftigen, konsistente Art und Weise, um es einfacher für die Menschen, die Sie helfen um es zu lesen. (Es ist auch wirklich nützlich, das immer zu tun, damit * Sie * es leichter lesen können.) –

+0

Seitennotiz: Das ist kein mehrdimensionales Array. Es ist eine Anordnung von Objekten. (Technisch gesehen hat JavaScript keine mehrdimensionalen Arrays, sondern Arrays von Arrays, zB '[[], [], []]'; Leute neigen dazu, sie als mehrdimensionale Arrays zu betrachten. Aber dies ist ein Array von Objekten anstelle von einem Array von Arrays, also überhaupt nicht wie ein MD-Array.) –

Antwort

1

Sie müssen in einfilter Rückruf beiden Filterwerte verwenden, anstatt mehr mit filter Anrufen:

list = [ {type: type1, code: code1}, {type: type2, code: code2}]; 

searchElement(code?: string, type?: string){ 
    var myVar = this.list; 

    if (type || code) { 
     myVar = myVar.filter(elt => (!type || elt.type.indexOf(type) > -1) && (!code || elt.code.indexOf(code) > -1)); 
    } 

    // ... 
} 

Beachten Sie, wie jede Bedingung in der Form ist !filterValue || useTheFilterValue so, dass, wenn kein Filterwert gibt, Diese Bedingung ist erfüllt, und wenn dies der Fall ist, ist sie nur erfüllt, wenn der Filter übereinstimmt.

Ich habe angenommen, dass eine "und" Übereinstimmung erforderlich ist, weshalb ich die beiden Filterprüfungen mit && beigetreten bin. Zum Beispiel, wenn Sie beide type und code liefern, nehme ich an, dass beide übereinstimmen müssen, um ein Element im Array zu behalten.

(Auch wurden Sie code gegen elt.type statt elt.code zu überprüfen.)