比较Javascript中的两个数组是否有不同的值

Kev*_*vin 2 javascript jquery

Javascript大师,我需要你的帮助.

我需要比较两个不同的数组并检查不同的值.值来自相同形式的多选元素.我尝试获取当前值列表(cacheTermList)并检查更改时的新值(newTermList).我的想法是,如果输入新值,我想将id传递给ajax调用,并将一些数据返回到屏幕.

码:

var cachedTermList = $('select#edit-categories').val();

      if (cachedTermList == null) {
        var cachedTermList = new Array();
      }

      $('select#edit-categories').chosen().change(function() {
        var newTermList = $('select#edit-categories').val();

        if (cachedTermList != null) {
          for(var i = 0; i < newTermList.length; i++) {
          alert(newTermList[i]);
            if (!($.inArray(newTermList[i], cachedTermList))) {
              $.ajax({
                 type: "GET",
                 url: "/classifieds/js/term/" + newTermList[i],
                 success: function(data){
                   //$('div#term-help-text').html(data);
                   cachedTermList.push(newTermList[i]);
                   alert(cachedTermList);
                 }
               });
            }
          }
        } else {

        }
      });
Run Code Online (Sandbox Code Playgroud)

忍受我,我不倾向于经常使用Javascript.我试图通过在加载时设置cachedTermList来获取当前值列表,然后当select更改时,将newTermList设置为字段的新值,然后循环它,并检查该列表中不在的列表中的值缓存列表.

虽然我可以看到事情发生,并转储两个术语列表并查看不同的值,但对于我的生活,我无法将其找到将已找到的值推送到缓存列表,以便下次元素更改时,它不会保留一次又一次地向ajax调用发送相同的值.在执行.push()之后,它只添加没有值的',,,'.我哪里错了?

Fel*_*ing 5

这是典型的闭环问题.所有success回调都引用相同的内容i.在执行回调时,循环已经完成并且i将具有值newTermList.length + 1,因此newTermList[i]将返回undefined.

您必须通过引入新范围来捕获索引或值,这可以通过调用函数来完成(JavaScript 没有块范围).

更新:另一个问题是,$.inArray不返回布尔值,而是返回元素的索引或-1.所以你必须比较返回值-1.

$('select#edit-categories').chosen().change(function() {
    // ...
    for(var i = 0; i < newTermList.length; i++) {
        if ($.inArray(newTermList[i], cachedTermList) === -1) {
            addTerm(newTermList[i], cachedTermList);
        }
    }
    //...
});


function addTerm(term, target) {
    $.ajax({
        type: "GET",
        url: "/classifieds/js/term/" + term,
        success: function(data){
            //$('div#term-help-text').html(data);
            target.push(term);
            alert(target);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

还要记住,所有Ajax调用基本上都会同时执行.循环不会等到一个调用完成.如果要一次执行一个调用,可以使用jQuery的Deferred对象.