Javascript jQuery合并/筛选选择器
我想合并被另一个选择器拆分的选择器。Javascript jQuery合并/筛选选择器,javascript,jquery,filtering,Javascript,Jquery,Filtering,我想合并被另一个选择器拆分的选择器。 我的实际选择器看起来像$('.JS_toggle-submenu') 当然,我不是在寻找静态解决方案。 我看不到一个有效的方法来做到这一点,似乎我需要再次循环,但我宁愿避免,但也许这里有人有一个神奇的解决方案 //编辑: 我需要IE7/8兼容性,这就是为什么我没有选择indexOf解决方案,但我在最初的问题中忽略了解释。 我在这里以每秒相同的速度比较了这两个结果。您可以根据以前找到的对象数组筛选出ID。比如: // Array of IDs already
我的实际选择器看起来像
$('.JS_toggle-submenu')
当然,我不是在寻找静态解决方案。我看不到一个有效的方法来做到这一点,似乎我需要再次循环,但我宁愿避免,但也许这里有人有一个神奇的解决方案 //编辑:
我需要IE7/8兼容性,这就是为什么我没有选择indexOf解决方案,但我在最初的问题中忽略了解释。
我在这里以每秒相同的速度比较了这两个结果。您可以根据以前找到的对象数组筛选出ID。比如:
// Array of IDs already found
var existing = [];
// Regex to pull the level number from the data attribute
var regexp = new RegExp("#submenu-l([0-9]+)-(.*?)", "i");
console.log($(".JS_toggle-submenu[data-submenu^='#submenu-l']").filter(function() {
// Get the ID
var id = regexp.exec($(this).data("submenu"))[1];
// If we have already found a DOM element for this level, continue
if(existing[id]) return false;
// Otherwise add it to the existing found elements...
existing[id] = true;
// Allow it to pass through the filter
return true;
}).get());
以下是使用jquery的每个循环:
var子菜单=[];
var firstMenus=[];
$('.JS_toggle-submenu')。每个(函数(){
var$this=$(this);
if(submenus.indexOf($this.data('submenu'))<0){
submenus.push($this.data('submenu'));
firstMenus.push($this);
}
});
console.log(第一个菜单);
我希望有人能给出更好的解决方案:)太好了!我正在试着做一个JSperf来与另一个答案进行比较!别忘了删除.get()
和控制台.log
-它们只是用来调试的-它们是一样的,但我更喜欢regex版本!我只需要添加一个.map来创建选择器,我更喜欢另一个版本(我没有说过,但我需要IE7-8兼容性)
<li class="JS_toggle-submenu" data-submenu="#submenu-l2-foo">…</li>
<p class="JS_toggle-submenu" data-submenu="#submenu-l3-bar">…</p>
// Array of IDs already found
var existing = [];
// Regex to pull the level number from the data attribute
var regexp = new RegExp("#submenu-l([0-9]+)-(.*?)", "i");
console.log($(".JS_toggle-submenu[data-submenu^='#submenu-l']").filter(function() {
// Get the ID
var id = regexp.exec($(this).data("submenu"))[1];
// If we have already found a DOM element for this level, continue
if(existing[id]) return false;
// Otherwise add it to the existing found elements...
existing[id] = true;
// Allow it to pass through the filter
return true;
}).get());
var submenus = [];
var firstMenus = [];
$('.JS_toggle-submenu').each(function(){
var $this = $(this);
if (submenus.indexOf($this.data('submenu')) < 0) {
submenus.push($this.data('submenu'));
firstMenus.push($this);
}
});
console.log(firstMenus);