我对使用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);
}
});
答案 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;
};
}