Mit reinem Javascript, beginnend mit einem Array, möchte ich ein Array zurückgeben, indem ich Werte entferne, die mit einem beliebigen Wert in einem zweiten Array übereinstimmen.

Ich habe dieses Problem gelöst, aber ich glaube mit mehr Code als wirklich notwendig.

Ich hoffe auf eine präzisere oder elegantere Lösung, bei der nur Javascript verwendet wird.

function removeValues(arr){
    array = arguments[0];
    args = Array.prototype.slice.call(arguments);
    len = arguments.length;
        filtered = array.filter(function(n){
            x = true;
            for (var i = 1; i < len; i++) {
                if (n == args[i]) { x = false; }
            }
            return x;
        });
    return filtered;
}

removeValues([1,2,3,1,2,3],2,3);

Sollte eine Funktion verwenden, die Werte aus dem ersten Argument (einem Array) entfernt, indem Werte in einem oder mehreren zusätzlichen Argumenten verwendet werden.

1
dtburgess 2 Sept. 2015 im 14:34

3 Antworten

Beste Antwort

Wenn Sie mit dem Filter -Funktion ist nicht erforderlich, um Schleifen zu verwenden, da Sie sich bereits in einer Schleife befinden. Nachdem Sie die Argumente mit [].slice.call(arguments) in ein Array konvertiert haben, können Sie indexOf, das für die Rückgabe der Position eines Werts in einem Array verantwortlich ist. Wenn kein Wert vorhanden ist, wird -1 zurückgegeben, sodass alle Ergebnisse übernommen werden -1

Ihr Code könnte ebenfalls reduziert werden:

function removeValues(arr){
  return arr.filter(function(val){
    return [].slice.call(removeValues.arguments).slice(1).indexOf(val) === -1
  })
}

console.log(removeValues([1,2,3,1,2,3],2,3))

ES6-Methode: Verwenden von Ruheparametern und Pfeilfunktionen

enter image description here

var removeValues = (arr, ...values) => arr.filter(val => values.indexOf(val) === -1)
3
Community 23 Mai 2017 im 11:52

Versuchen Sie dies stattdessen ...

function removeValues(){
    var args = Array.prototype.slice.call(arguments).slice(1);
    return arguments[0].filter(function(value) {
        return args.indexOf(value) === -1;
    });
}

removeValues([1, 2, 3, 1, 2, 3], 2, 3);

Es macht genau das Gleiche, räumt es aber leicht auf.

3
Reinstate Monica Cellio 2 Sept. 2015 im 11:55

Versuchen Sie es wie folgt:

var array1 = [ 1, 2, 3, 4, 5 ];
var array2 = [ 2, 3 ];

var result = array1.filter( function ( elem ) {
    return array2.indexOf( elem ) === -1;
});

Siehe Beispiel: Ausführen von Code

1
DDan 2 Sept. 2015 im 11:41