2016-06-10 12 views
0

Ich versuche, die Artikel in „item“ Array und dem copyofOpList Array zu vergleichen, die Daten Vorkommen in copyofOpListDaten aus einem Array entfernen, es zu einem anderen Array zu vergleichen

das ist mein Versuch abzurufen:

var _deleteUsedElement1 = function(item) { 

        for (var i = 0; i < item.length-1; i++){  
          for (var j = 0; j< $scope.copyofOpList.length-1; j++){ 
         if (item[i].operationCode == $scope.copyofOpList[j].code) { 
         $scope.copyofOpList.splice(j, 1); 

         } } } }; 

$scope.compareArrays = function() { 
    ...Get data from web Service 
    _deleteUsedElement1(item); 
    } 

das copyofOpList Array hat 14 Elemente, und das Elementarray hat 2 Array aber mein Code löscht nur ein Vorkommen (das erste), also wie kann ich meinen Code korrigieren, um alle Vorkommen im copyofOpList Array im Vergleich zum Artikel-Array Dank für Hilfe

Antwort

3

Ich würde versuchen, in einer Schleife zu vermeiden Looping - das ist weder eine sehr elegante noch eine sehr effiziente Art und Weise das gewünschte Ergebnis zu erhalten.

Hier ist etwas eleganter und höchstwahrscheinlich effizienter:

var item = [1,2], copyofOpList = [1,2,3,4,5,6,7]; 

var _deleteUsedElement1 = function(item, copyofOpList) { 
    return copyofOpList.filter(function(listItem) { 
    return item.indexOf(listItem) === -1; 
    }); 
    }; 

    copyofOpList = _deleteUsedElement1(item, copyofOpList); 
    console.log(copyofOpList); 
    //prints [3,4,5,6,7] 
} 

Und da ich gerade bemerkt, dass Sie Objekteigenschaften sind zu vergleichen, hier ist eine Version, die auf passende Objekteigenschaften-Filter:

var item = [{opCode:1},{opCode:2}], 
    copyofOpList = [{opCode:1},{opCode:2},{opCode:3},{opCode:4},{opCode:5},{opCode:6},{opCode:7}]; 

var _deleteUsedElement1 = function(item, copyofOpList) { 
     var iOpCodes = item.map(function (i) {return i.opCode;}); 
     return copyofOpList.filter(function(listItem) { 
     return iOpCodes.indexOf(listItem.opCode) === -1; 
     }); 
    }; 

copyofOpList = _deleteUsedElement1(item, copyofOpList); 
console.log(copyofOpList); 
//prints [{opCode:3},{opCode:4},{opCode:5},{opCode:6},{opCode:7}] 

Ein weiterer Vorteil dieser Vorgehensweise besteht darin, dass Sie Ihre Arrays nicht modifizieren, während Sie noch daran arbeiten, ein positiver Effekt, den sowohl JonSG als auch Furhan S. in ihren Antworten erwähnten.

+1

danke Sir für Ihre Antwort :) – Jina

+0

Das ist sehr elegant und prägnant. Obwohl ich darauf hinweisen möchte, dass es immer noch innerhalb einer Schleife läuft, weil indexOf() eine Schleife in sich selbst ist. –

+0

Mit Ihren Änderungen deckt dies meine Antwort ab, also werde ich sie entfernen. – JonSG

2

Spleißen ändert Ihr Array. Verwenden Sie einen temporären Puffer-Array für neue Werte wie folgt aus:

var _deleteUsedElement1 = function(item) { 
    var _temp = []; 
    for (var i = 0; i < $scope.copyofOpList.length-1; i++){  
     for (var j = 0; j< item.length-1; j++){ 
      if ($scope.copyofOpList[i].code != item[j].operationCode) { 
       _temp.push($scope.copyofOpList[j]); 
      } 
     } 
    } 
    $scope.copyofOpList = _temp; 
}; 
+2

Haben Sie das getestet? Ich denke nicht, dass es das tut, was der Anforderer braucht. – Tex

+1

@ Tex Sie hatten Recht. Habe das erste Mal nicht getestet, hoffe, dass der bearbeitete Code tut, was nach meinem Verständnis erforderlich ist. Thnx, um darauf hinzuweisen. –

+1

Hey, schau mal filter(), es macht was du tust mit _temp – JonSG

Verwandte Themen