2014-12-30 57 views
1

我只是想知道是否有更好的方法来编写下面的代码?注意:下面的作品100%很好。JQuery - 重新排列对象 - 最短的代码解决方案

目前这会创建一个对象数组。那么我称他们为对象。我可以更好地说DOM参考。注意:请纠正我 - 渴望学习。

然后它循环遍历它们,隐藏所有并仅显示那些与'sortText'中的文本/字符串匹配的具有类'.contactsBodyMainDisplayMemberUserNameH2'(这是很多儿童向下)的类。

var contactsMemberArray = $('#contactsMainWrapperDIV').children() 
          .map(function() {return $(this);}).get(); 
$.each(contactsMemberArray, function() { 
    $(this).hide(); 
    var username = $('.contactsBodyMainDisplayMemberUserNameH2', this).text(); 
    if(username != '' && username.toLowerCase().indexOf(sortText.toLowerCase()) >= 0) { 
     $(this).show(); 
    } 
}); 
  • 有一个更快的方式做到这一点?
  • 我需要先映射对象还是只能对它们进行排序?

JS Fiddle

+1

HI,很好的问题。然而,如果你把它变成一个简单的方法让人们更容易帮忙,那会更好。 – Todd

+0

会做 - 谢谢你 – Adam

+0

我知道你不会失望。 :P – Todd

回答

1

你可以做这样的事情。

var contactsMemberArray = $('#contactsMainWrapperDIV').children().hide(); 
$.each(contactsMemberArray, function() { 
    var username = $(this).find('.contactsBodyMainDisplayMemberUserNameH2').text(); 
    if(username !== '' && username.toLowerCase().indexOf(sortText.toLowerCase()) >= 0) { 
     $(this).show(); 
    } 
}); 
1

您的代码看起来不错!您可以将第一行简化为:

var contactsMemberArray = $('#contactsMainWrapperDIV').children() 

这应该仍然可以正常工作。返回的jQuery对象将包含一个包含子元素的数组,每个元素都是围绕DOM元素的jQuery包装器,您可以直接将其传递给$ .each。

通常在jQuery中,可以在'jQuery-space'中工作,并且很少需要调用get()从jQuery对象获取DOM元素。您可以调用jQuery来获得单个DOM元素或DOM元素数组周围的包装。这意味着您有时可以在没有$.each循环的情况下执行操作。例如,只是做你的代码的.hide()部分,你可以这样做:

$('#contactsMainWrapperDIV').children().hide() 

这将创建一个jQuery对象与数组保存所有的孩子,隐藏所有的人。

但是,为了比较孩子与sortText的逻辑,我认为你的$ .each循环是好的。

如果将sortText.toLowerCase()从循环中移出,那么只需执行一次,而不是循环的每次循环,这样做的确很小巧。

我已经更新了你的提琴,以显示这些提示:http://jsfiddle.net/dyvhg23w/6/

你可以把它改写成更jQuery的一个衬垫。我不一定是这些人的忠实粉丝,因为他们的阅读和维护可能会变得非常复杂,但他们的确帮助您了解如何链接jQuery命令。根据您小提琴的HTML,我们可以得到孩子们的阵列,隐藏的一切,然后过滤对sortText数组,然后显示剩下:

var sortText = 'ee' 
var sortTextLower = sortText.toLowerCase() 
$(".contactsBodyMainDisplayMemberContainerDIV") 
    .hide() 
    .filter(function(idx, child) { 
     return $(child).find('.contactsBodyMainDisplayMemberUserNameH2') 
        .text().toLowerCase().indexOf(sortTextLower) >= 0 
    }) 
    .show() 

http://jsfiddle.net/dyvhg23w/19/

希望帮助了一下,喊如果你有更多的问题。

1

这里的一个短VERS。更多来。

DEMO

var sortText = 'ee'.toUpperCase(), 
    $contacts = $('#contactsMainWrapperDIV > *').hide(); 
$.each($contacts, function() { 
    var $this = $(this); 
    ~$this[0].textContent.toUpperCase().indexOf(sortText) && $this.show(); 
}); 

编辑

我会说这是一个有点简单:

$(function() { 
    var sortText = 'ee'; 
    $('#contactsMainWrapperDIV > *:not(:contains(' + sortText + '))').hide(); 
});