2017-07-13 1 views
0

Ich durchsucht So viele Fragen, um herauszufinden, Logik zum Auffinden von Index in einem tief verschachtelten Array von Objekt, fand ich nicht nützlich für meine Anforderung obwohl.Suchen Sie den Wert und löschen Sie das gesamte Objekt mit diesem Array aus einem tief geschachtelten Array von Objekt

auf der Suche nach Lösung in Javascript, Lodash/Underscore wäre auch gut. Lassen Sie mich nur die gesamte Anforderung aussprechen, in der Hoffnung, ich bekomme einen Weg, um die Lösung für dieses Problem zu finden.

Voraussetzung:
Ich habe ein Array von Objekten

arrObj =[ 
     { 
      "id":3208, 
      "name":"List", 
      "issueResponses":[ 

      ], 
      "isActive":false 
     }, 
     { 
      "id":3209, 
      "name":"Me", 
      "issueResponses":[ 
      ], 
      "isActive":false 
     }, 
     { 
      "id":3314, 
      "name":"SNew", 
      "issueResponses":[ 

      ], 
      "isActive":false 
     }, 
     { 
      "id":3315, 
      "name":"Olive", 
      "issueResponses":[ 
       { 
        "id":3282, 
        "name":"related to Olive", 
        "issueResponses":[ 

        ], 
        "isActive":false 
       }, 
       { 
        "id":3316, 
        "name":"My olives are not yet picked", 
        "issueResponses":[ 
         { 
          "id":3317, 
          "name":"Pickup Not Done", 
          "issueResponses":[ 

          ], 
          "isActive":false 
         } 
        ] 
       } 
      ] 
     } 
    ] 

Wie wir seine tief verschachtelten sehen können, habe ich ein anderes Array

delValue = [3317,3282], Und es morgen könnte etwas in diesen Tiefenverschachtelung sein. Ich muss diese delValue-Arrays in arrObj finden und alle diese Objekte löschen, die "id" als diese Werte haben.

Ich versuche, dies in einer generischen Weise zu lösen, die eine Anzahl tiefe Suche Ebene und Löschung des Objekts von diesem unterstützen kann.

Bitte helfen Sie mir in diesem, wenn weitere Informationen benötigt werden, um glücklich zu sein.

Antwort

0

Just keep issueResponses Überprüfung - etwa so:

function deleteIssueResponses(issues, ids) { 
    for (let i = issues.length; i >= 0; i--) { 
     if (issues[i].issueResponses.length) { 
      deleteIssueResponses(issues[i].issueResponses, ids); 
     } 

     if (ids.contains(issues[i].id)) { 
      issues.splice(i, 1); 
     } 
    } 
} 

Und nennen es:

deleteIssueResponses(arrObj, [3317,3282]); 
0

Dies sollte ganz einfach sein, mit etwas Rekursion zu lösen. Diese Funktion löscht die angegebenen IDs in dem Array, das an sie übergeben wurde, oder ruft sich selbst auf, um dasselbe für die verschachtelten Arrays zu tun.

function deleteIds(arr, ids) { 
    for (let i = 0; i < arr.length; i++) { 
    if (ids.indexOf(arr[i].id) !== -1) { 
     arr.splice(i, 1); 
     i--; 
    } else { 
     deleteIds(arr[i].issueResponses, ids); 
    } 
    } 
} 

Anruf mit deleteIds(arrObj, delValue) wie in Ihrer Frage.

0

können Sie verwenden Filter, dies zu erreichen:

function removeDeletions(array, deletion) { 
    return array.filter(el => { 
     if (Array.isArray(el.issueResponses)) el.issueResponses = removeDeletions(el.issueResponses, deletion); 
     return ! deletion.includes(el.id); 
    }) 
} 

DEMO:

let arrObj = [{ 
 
    "id": 3208, 
 
    "name": "List", 
 
    "issueResponses": [ 
 

 
    ], 
 
    "isActive": false 
 
    }, 
 
    { 
 
    "id": 3209, 
 
    "name": "Me", 
 
    "issueResponses": [], 
 
    "isActive": false 
 
    }, 
 
    { 
 
    "id": 3314, 
 
    "name": "SNew", 
 
    "issueResponses": [ 
 

 
    ], 
 
    "isActive": false 
 
    }, 
 
    { 
 
    "id": 3315, 
 
    "name": "Olive", 
 
    "issueResponses": [{ 
 
     "id": 3282, 
 
     "name": "related to Olive", 
 
     "issueResponses": [ 
 

 
     ], 
 
     "isActive": false 
 
     }, 
 
     { 
 
     "id": 3316, 
 
     "name": "My olives are not yet picked", 
 
     "issueResponses": [{ 
 
      "id": 3317, 
 
      "name": "Pickup Not Done", 
 
      "issueResponses": [ 
 

 
      ], 
 
      "isActive": false 
 
     }] 
 
     } 
 
    ] 
 
    } 
 
] 
 
let delValue = [3317, 3282]; 
 

 
function removeDeletions(array, deletion) { 
 
    return array.filter(el => { 
 
    if (Array.isArray(el.issueResponses)) el.issueResponses = removeDeletions(el.issueResponses, deletion); 
 
    return !deletion.includes(el.id); 
 
    }) 
 
} 
 

 
console.log(removeDeletions(arrObj, delValue));

Verwandte Themen