JavaScript/jQuery-脚本不工作-添加&;删除类,合并数组-测试用例

JavaScript/jQuery-脚本不工作-添加&;删除类,合并数组-测试用例,javascript,jquery,arrays,class,merge,Javascript,Jquery,Arrays,Class,Merge,我有这个剧本: JS // A & B is needed var needed = ["#n01", "#n03"]; // always holds what the user has clicked var user = []; // needed + user var mixed = []; // takes care of highlighting clicked letters & // updating the user array function

我有这个剧本:

JS

// A & B is needed
var needed = ["#n01", "#n03"];

// always holds what the user has clicked    
var user = [];

// needed + user
var mixed = [];

// takes care of highlighting clicked letters &
// updating the user array

function hilit ( elem, cssClass ) {
    $( elem ).click( function () {
        if( $( this ).hasClass( cssClass )){ 
            //remove from array "highlighted"
           user.splice( $.inArray( "#" + $( this ).attr( "id" ), user ), 1 );  
            $( this ).removeClass( cssClass );
        } else {
            // add to array array "highlighted"
            user.push( "#" + $( this ).attr( "id" ) );
            $( this ).addClass( cssClass );
        }
    });
}

// is something wrong here? it works locally...

$("#lorem").on("click", function() {
       // merging -> needed + user
    mixed = $.merge(needed, user);

    // removing duplicates
    var map = new Object();
        for ( var i = 0; i < mixed.length; i++ ) {
            if (map[mixed[i]] === undefined ){
                map[mixed[i]] = 1;
            }
            else{
                map[mixed[i]]++;
            }
        }

        // result = letters the user didn't click
        var result = new Array();
        for( var i = 0; i < mixed.length; i++ ){   
            if( map[mixed[i]] > 1 ){
                //do nothing
            }
            else{
                result.push(mixed[i]);
            }
        }
)};

hilit (".letter", "color");
body {
    font-size: 160px;
    font-weight: bold;
}

.letter {
    cursor: pointer;
}

.color {
    background: red;
}

说明

段落
#lorem
中的每个字母都用
span
包装。字母
。单击
.letter
时,将检查类
.color
是否存在。如果是,则删除
.color
,并从数组
用户中删除相应的ID
。否则将添加
颜色
,并将id推入
用户

有三种数组:
needed
user
mixed
needed
保存用户需要单击的ID<代码>用户保存用户单击的ID<代码>混合是用户,需要合并

每次单击,
所需的
用户
都会合并到
混合
。结果是
mixed
两次保存某些ID。然后过滤掉这些重复项,留下用户本应单击但未在数组中单击的元素ID
result

问题

好吧,一开始:我直接从我的编辑器中获取代码,但不知怎么的,它无法正常工作。我在脚本中断的地方添加了一条注释。这是JSFIDLE的怪癖还是我把事情搞砸了

单击带有
.color
的元素后,ID应仅在
mixed
中显示一次。相反,它现在出现了三次。因此,不再在hilit中删除它,而是再次添加它。 为什么会这样&我怎样才能解决这个问题?这与我在()上使用
有关吗

非常需要并感谢任何帮助

这似乎现在起作用了:

$(“#lorem”)。在(“单击”,函数(){
//合并->需要+用户
混合=$.merge(需要,用户);
//删除重复项
var map=新对象();
对于(变量i=0;i1){
//无所事事
}
否则{
结果:推送(混合[i]);
}
}
});
编辑:

查看功能的文档:

如果需要原始的第一个数组,请在调用之前复制它 $.merge()

这似乎现在起作用了:

$(“#lorem”)。在(“单击”,函数(){
//合并->需要+用户
混合=$.merge(需要,用户);
//删除重复项
var map=新对象();
对于(变量i=0;i1){
//无所事事
}
否则{
结果:推送(混合[i]);
}
}
});
编辑:

查看功能的文档:

如果需要原始的第一个数组,请在调用之前复制它 $.merge()


代码提示:{}[]分别优于新对象()新数组()。代码提示:{}[]分别优于新对象()新数组()。谢谢,请问有什么问题吗?我看你实际上没有改变密码。你的意思是小提琴现在能用了,对吧?哦,天哪,那真是令人尴尬哈哈;-)虽然这并不能解决上述主要问题,但它发生在我们所有人身上…:-)谢谢,请问怎么了?我看你实际上没有改变密码。你的意思是小提琴现在能用了,对吧?哦,天哪,那真是令人尴尬哈哈;-)虽然这并不能解决上述主要问题,但它发生在我们所有人身上…:-)
body {
    font-size: 160px;
    font-weight: bold;
}

.letter {
    cursor: pointer;
}

.color {
    background: red;
}
$("#lorem").on("click", function() {
       // merging -> needed + user
    mixed = $.merge(needed, user);

    // removing duplicates
    var map = new Object();
        for ( var i = 0; i < mixed.length; i++ ) {
            if (map[mixed[i]] === undefined ){
                map[mixed[i]] = 1;
            }
            else{
                map[mixed[i]]++;
            }
        }

        // result = letters the user didn't click
        var result = new Array();
        for( var i = 0; i < mixed.length; i++ ){   
            if( map[mixed[i]] > 1 ){
                //do nothing
            }
            else{
                result.push(mixed[i]);
            }
        }
});