Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery合并/筛选选择器_Javascript_Jquery_Filtering - Fatal编程技术网

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);