it-swarm.com.de

Entfernen Sie die Elemente mit der for-Schleife aus dem Array

Ich möchte eine Art jQuery-Livesuche implementieren. Aber bevor ich die Eingaben an den Server sende, möchte ich alle Elemente in meinem Array entfernen, die 3 oder weniger Zeichen enthalten (da diese Wörter in der deutschen Sprache normalerweise in Bezug auf die Suche ignoriert werden können). Also ["this", "is", "a", "test"] wird ["this", "test"]

$(document).ready(function() {
var timer, searchInput;
$('#searchFAQ').keyup(function() {
    clearTimeout(timer);
    timer = setTimeout(function() {
        searchInput = $('#searchFAQ').val().match(/\w+/g);
        if(searchInput) {
            for (var elem in searchInput) {
                if (searchInput[elem].length < 4) {
                    //remove those entries
                    searchInput.splice(elem, 1);
                }
            }
            $('#output').text(searchInput);
            //ajax call here
        }
    }, 500);
});
});

Jetzt ist mein Problem, dass nicht alle Elemente in meiner for-Schleife entfernt werden. Wenn ich zum Beispiel tippe "das ist ein Test" wird "entfernt," ein "bleibt. JSFIDDLE

Ich denke, das Problem ist die for-Schleife, weil sich die Indizes des Arrays ändern, wenn ich ein Element mit Spleiß entferne, sodass es mit dem "falschen" Index weitergeht.

Vielleicht könnte mir jemand helfen?

48
SirDerpington

Lösung 1

Sie können eine Schleife rückwärts ausführen, mit etwa den folgenden Schritten:

var searchInput, i;

searchInput = ["this", "is", "a", "test"];
i = searchInput.length;
while (i--) {
    if (searchInput[i].length < 4) {
        searchInput.splice(i, 1);
    }
}

DEMO: http://jsfiddle.net/KXMeR/

Dies liegt daran, dass beim schrittweisen Durchlaufen des Arrays beim Verbinden das Array an der richtigen Stelle geändert wird, sodass die Elemente "verschoben" werden und Sie die Iteration einiger Elemente überspringen. Das Zurückschleifen (mit einer while oder sogar einer for Schleife) behebt dies, weil Sie nicht in die Richtung schleifen, in die Sie spleißen.


Lösung 2

Gleichzeitig ist es in der Regel schneller, ein neues Array zu generieren, als es direkt zu ändern. Hier ist ein Beispiel:

var searchInput, newSearchInput, i, j, cur;

searchInput = ["this", "is", "a", "test"];
newSearchInput = [];
for (i = 0, j = searchInput.length; i < j; i++) {
    cur = searchInput[i];
    if (cur.length > 3) {
        newSearchInput.Push(cur);
    }
}

dabei enthält newSearchInput nur Elemente mit gültiger Länge und Sie haben weiterhin die ursprünglichen Elemente in searchInput.

DEMO: http://jsfiddle.net/RYAx2/


Lösung 3

Zusätzlich zu der obigen zweiten Lösung gibt es eine ähnliche, neuere Array.prototype Methode ist verfügbar, um das besser zu handhaben: filter. Hier ist ein Beispiel:

var searchInput, newSearchInput;

searchInput = ["this", "is", "a", "test"];
newSearchInput = searchInput.filter(function (value, index, array) {
    return (value.length > 3);
});

DEMO: http://jsfiddle.net/qky7D/


Referenzen:

131
Ian
var myArr = [0,1,2,3,4,5,6];

Problemstellung:

myArr.splice(2,1);

  \\ [0, 1, 3, 4, 5, 6];

jetzt bewegen sich 3 auf der zweiten Position und die Länge wird um 1 verringert, was zu Problemen führt.

Lösung: Eine einfache Lösung wäre, beim Spleißen in umgekehrter Richtung zu iterieren.

var i = myArr.length;
while (i--) {
    // do your stuff
}
5

Wenn Sie die Bibliothek lodash installiert haben, haben sie ein süßes Juwel, das Sie vielleicht in Betracht ziehen sollten.

Die Funktion ist _. ForEachRight (durchläuft Elemente einer Sammlung von rechts nach rechts links)

Hier ist ein Beispiel.

var searchInput = ["this", "is", "a", "test"];

_.forEachRight(searchInput, function(value, key) {

    if (value.length < 4) {
        searchInput.splice(key, 1);
    }
});
2
Clinton Dobbs

Sie können auch die Funktion $. Grep verwenden, um ein Array zu filtern:

var timer, searchInput;
$('#searchFAQ').keyup(function () {
    clearTimeout(timer);
    timer = setTimeout(function () {
        searchInput = $('#searchFAQ').val().split(/\s+/g); // match is okay too
        searchInput = $.grep(searchInput, function(el) {
            return el.length >= 4;
        });
        console.log(searchInput);
    }, 500);
});

http://jsfiddle.net/dfsq/4Wdp9/

1
dfsq