JavaScript не удаляет неопределенные объекты из массива - PullRequest
0 голосов
/ 22 июля 2011

У меня есть текстовый поиск на странице с использованием JS, который находится здесь:

$.fn.eoTextSearch = function(pat) {
    var out = []
    var textNodes = function(n) {
        if (!window['Node']) {
            window.Node = new Object();
            Node.ELEMENT_NODE = 1;
            Node.ATTRIBUTE_NODE = 2;
            Node.TEXT_NODE = 3;
            Node.CDATA_SECTION_NODE = 4;
            Node.ENTITY_REFERENCE_NODE = 5;
            Node.ENTITY_NODE = 6;
            Node.PROCESSING_INSTRUCTION_NODE = 7;
            Node.COMMENT_NODE = 8;
            Node.DOCUMENT_NODE = 9;
            Node.DOCUMENT_TYPE_NODE = 10;
            Node.DOCUMENT_FRAGMENT_NODE = 11;
            Node.NOTATION_NODE = 12;
        }
        if (n.nodeType == Node.TEXT_NODE) {
            var t = typeof pat == 'string' ?
            n.nodeValue.indexOf(pat) != -1 :
            pat.test(n.nodeValue);
            if (t) {
                out.push(n.parentNode)
            }
        }
        else {
            $.each(n.childNodes, function(a, b) {
                textNodes(b)
            })
        }
    }
    this.each(function() {
        textNodes(this)
    })
    return out
};

И у меня есть возможность скрывать столбцы и строки в таблице. Когда я отправляю поиск и получаю подсвеченные результаты, в этом случае длина массива найденных текстовых узлов будет равна 6, но на странице будет выделено только 3. Когда вы выводите массив на консоль, вы получаете это:

Итак, вы получите 3 тега, которые я ожидал, но вы видите, что массив на самом деле состоит из [span,undefined,span,undefined,undefined,span]. Таким образом, давая мне длину 6.

<span>
<span>
<span>
[span, undefined, span, undefined, undefined, span]

Я не знаю, почему он не удаляет все неопределенные текстовые узлы, когда я проверяю их. Вот что у меня есть для функции.

performTextSearch = function(currentObj){
    if($.trim(currentObj.val()).length > 0){
        var n = $("body").eoTextSearch($.trim(currentObj.val())),
            recordTitle = "matches",
            arrayRecheck = new Array(),
            genericElemArray = new Array()
        if(n.length == 1){
            recordTitle = "match"
        }

        //check to see if we need to do a recount on the array length. 
        //if it's more than 0, then they're doing a compare and we need to strip out all of the text nodes that don't have a visible parent.
        if($(".rows:checked").length > 0){
            $.each(n,function(i,currElem){
                if($(currElem).length != 0 && typeof currElem != 'undefined'){
                    if($(currElem).closest("tr").is(":visible") || $(currElem).is(":visible")){
                        //remove the element from the array
                        console.log(currElem)
                        arrayRecheck[i] = currElem
                    }
                }
            })
        }
        if(arrayRecheck.length > 0){
            genericElemArray.push(arrayRecheck)
            console.log(arrayRecheck)
        }
        else{
            genericElemArray.push(n)    
        }
        genericElemArray = genericElemArray[0]
        $("#recordCount").text(genericElemArray.length + " " +recordTitle)
        $(".searchResults").show()
        for(var i = 0; i < genericElemArray.length; ++i){ 
            void($(genericElemArray[i]).addClass("yellowBkgd").addClass("highLighted"))
        }   
    }
    else{
        $(".highLighted").css("background","none")  
    }           
}

Если вы посмотрите на приведенный ниже код "// проверьте, нужно ли нам пересчитывать длину массива.", Вы увидите, где я удаляю текстовые узлы на основе дисплея и или не объект определен. Я проверяю длину вместо undefined, потому что typeof == undefined по какой-то причине вообще не работал. Видимо, все еще ускользает, хотя.

Есть идеи, почему я все еще получаю неопределенные объекты в массиве?

Мои извинения за такой большой пост!

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Я изменил вашу функцию eoTextSearch(), чтобы удалить зависимости от глобальных переменных в обмен на замыкания:

$.fn.extend({
  // helper function
  // recurses into a DOM object and calls a custom function for every descendant
  eachDescendant: function (callback) {
    for (var i=0, j=this.length; i<j; i++) {
      callback.call(this[i]);
      $.fn.eachDescendant.call(this[i].childNodes, callback);
    }
    return this;
  },
  // your text search function, revised
  eoTextSearch: function () {
    var text = document.createTextNode("test").textContent 
               ? "textContent" : "innerText";
    // the "matches" function uses an out param instead of a return value
    var matches = function (pat, outArray) {
      var isRe = typeof pat.test == "function";
      return function() {
        if (this.nodeType != 3) return; // ...text nodes only
        if (isRe && pat.test(this[text]) || this[text].indexOf(pat) > -1) {
          outArray.push(this.parentNode);
        }
      }
    };
    // this is the function that will *actually* become eoTextSearch()
    return function (stringOrPattern) {
      var result = $(); // start with an empty jQuery object
      this.eachDescendant( matches(stringOrPattern, result) );
      return result;
    }
  }()  // <- instant calling is important here
});

И тогда вы можете сделать что-то вроде этого:

$("body").eoTextSearch("foo").filter(function () {
  return $(this).closest("tr").is(":visible");
});

Удалить ненужные элементы из результата поиска.Нет "пересчет длины массива" необходимо.Или вы используете each() напрямую и решаете, что делать.

0 голосов
/ 25 июля 2011

Нашел ответ в другом посте.

Удалить пустые элементы из массива в Javascript

Закончилось использование второго варианта ответа, и все заработало нормально.

0 голосов
/ 25 июля 2011

Я не могу полностью разобраться в вашем коде, но наиболее вероятная проблема заключается в том, что вы удаляете элементы из массива, но не сжимаете массив впоследствии. Простое удаление элементов вернет вам «undefined» и не свернет массив.

Я бы предложил вам выполнить одно из следующих действий:

  1. Скопировать массив в новый массив, но скопировать только те элементы, которые не определены

  2. Используйте только те элементы массива, которые не определены.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...