58

一種の jQuery ライブ検索を実装したいと考えています。しかし、入力をサーバーに送信する前に、配列内の 3 文字以下のすべての項目を削除したいと思います (ドイツ語では、これらの単語は通常、検索の観点から無視できるため) ["this", "is", "a", "test"]["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);
});
});

今私の問題は、すべてのアイテムが for ループで削除されるわけではないということです。たとえば、「これはテストです」と入力すると、「is」が削除され、「a」が残ります。 JSFIDDLE

スプライスでアイテムを削除すると配列のインデックスが変更されるため、問題は for ループだと思います。そのため、「間違った」インデックスで続行します。

おそらく誰かが私を助けることができますか?

4

5 に答える 5

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

問題文:

myArr.splice(2,1);

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

2番目の位置で3移動し、長さが1減少して問題が発生します。

解決策:簡単な解決策は、スプライシング時に逆方向に繰り返すことです。

var i = myArr.length;
while (i--) {
    // do your stuff
}
于 2015-01-07T11:34:37.313 に答える
3

lodashライブラリがインストールされている場合は、検討したい素敵な gem があります。

関数は_.forEachRight (コレクションの要素を右から左に繰り返します)

ここに例があります。

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

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

    if (value.length < 4) {
        searchInput.splice(key, 1);
    }
});
于 2015-09-30T20:26:36.483 に答える
0

別のアプローチは、配列からスライスするたびにインデックスをデクリメントすることです (x--)。これにより、配列が下にシフトされたときに次の要素がスキップされなくなります。

var searchInput;

searchInput = ["this", "is", "a", "test"];
for (var x = 0; x < searchInput.length; x++) {
    if (searchInput[x].length < 4) {
        searchInput.splice(x--, 1);
    }
}

console.log(searchInput);

デモ: https://jsfiddle.net/alinaeem229/n2kq3690/1/

于 2019-12-04T14:24:18.387 に答える