将唯一的JQuery对象推送到数组

时间:2016-05-25 10:36:49

标签: javascript jquery arrays

我对使用Jquery完全不熟悉,我正在尝试将唯一对象推送到数组,如果对象已经在数组中,则会删除它们。这是为了让学生通过单击可用选项预订多个教程类,然后提交包含所有选定选项的完整数组。

我已经完全根据我编写的内容更新了我的代码。如果我只使用数组中的单个元素,此代码可以正常工作。如果我在数组中使用对象,则无法评估重复的选定插槽。

   var bookingSlots = [];
   $('.row').on('click','.slots', function (e) {
    e.preventDefault();
    $(this).toggleClass('selected');
    var slotID = $(this).attr('data-slot-id');
    var studentID = $(this).attr('data-student-id');
    var slot = {slotID: slotID, studentID: studentID};
    var found = jQuery.inArray(slot,bookingSlots);

    if(found < 0){
        bookingSlots.push(slot);
    }else{
        bookingSlots.splice(found, 1);
    }
});

2 个答案:

答案 0 :(得分:0)

在您的情况下,我建议您查看LINQ JS

示例:

var exObjArr = Enumerable.From(array)
                   .Where(function(x){return x.id1 == object.id1 && x.id2 == object.id2})
                   .ToArray();

if(exObjArr.length == 0){
     //object does not exist
} else{
     //object exists
}

答案 1 :(得分:0)

来自你的评论:

  

每次点击都会创建对象

问题在于:等效对象彼此不是=====,而inArray使用===来查找对象。例如,$.inArray({id:1}, [{id:1}])会返回-1

console.log($.inArray({id:1}, [{id:1}])); // -1
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

所以你会想要使用别的东西。在现代浏览器中,您可以使用Array#findIndex并使用谓词函数:

var index = array.findIndex(function(e) { return e.id == id && e.id2 == id2; });

示例:

var array = [];
run(1, 1); // adds
run(1, 2); // adds
run(1, 1); // removes
console.log(array); // ends up with just the 1,2 object in it

function run(id, id2) {
  // Find the equivalent object if any
  var index = array.findIndex(function(e) { return e.id == id && e.id2 == id2; });
  
  // Found?
  if (index == -1) {
    // No, add one
    array.push({id: id, id2: id2});
  } else {
    // Yes, remove it
    array.splice(index, 1);
  }
}

Array#findIndex可以在旧浏览器上进行填充/填充; MDN有一个polyfill here (我也在下面引用它,以防万一,但我无法想象MDN会很快消失)

附注:ES2015(又名“ES6”)更简洁(浏览器尚未准备好让我们在野外使用ES2015,但你可以透露):

let index = array.findIndex(e => e.id == id && e.id2 == id2);

截至本文撰写时(2015年5月25日),这是MDN的polyfill:

if (!Array.prototype.findIndex) {
  Array.prototype.findIndex = function(predicate) {
    if (this === null) {
      throw new TypeError('Array.prototype.findIndex called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return i;
      }
    }
    return -1;
  };
}