我有一个包含用户帐户和复选框的页面。在保存时,我需要将复选框的所有值添加到对象中,只要它们不存在。
当我使用关联数组时,我有这个工作,因为我当时只存储一个值。我现在将它存储为一个对象,我需要确保QID(这是唯一的)在对象中已经存在。
有一种优雅的方式可以解决这个问题吗?
> matrix(letters[1:10],2)
[,1] [,2] [,3] [,4] [,5]
[1,] "a" "c" "e" "g" "i"
[2,] "b" "d" "f" "h" "j"
答案 0 :(得分:1)
只需保留一个您添加ID的地图,这样就可以轻松有效地检查ID是否存在,无论数组中的数据结构如何
var selectedUsers = [];
var addedUsers = {};
$(tab).find(".cb:checked").each(function() {
var qid = this.value;
if ( !(qid in addedUsers) ) {
selectedUsers.push({
qid : qid,
first : $(this).data('emp_first'),
last : $(this).data('emp_last'),
department : $(this).data('emp_dept')
});
addedUsers[qid] = 'x';
}
});
答案 1 :(得分:1)
创建一个通用查找函数,然后使用它:
function lookup(myArray, searchTerm, property, firstOnly) {
var found = [];
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) {
found.push(myArray[i]);
if (firstOnly) break; //if only the first
}
}
return found;
}
使用它:
var existUser = lookup(selectedUsers,"qid",$(this).val(),true);
if(existUser && existUser.length){// it returned a match if len > 0
push it here
}
如果有人已经进行了查找,那就有点冒险了,所以让我们用其他一些命名空间:(将myApp
改为你的)
使用:
var existUser = myApp.arrayObj.lookup(selectedUsers,"qid",$(this).val(),true);
或使用contains:
var hasUser = myApp.arrayObj.contains(selectedUsers,"qid",$(this).val());
功能:
var myApp = myApp || {};
myApp.arrayObj = {
indexOf: function(myArray, searchTerm, property) {
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) return i;
}
return -1;
},
indexAllOf: function(myArray, searchTerm, property) {
var ai = [];
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) ai.push(i);
}
return ai;
},
lookup: function(myArray, searchTerm, property, firstOnly) {
var found = [];
for (var i = 0; i < myArray.length; i++) {
if (myArray[i][property] === searchTerm) {
found.push(myArray[i]);
if (firstOnly) break; //if only the first
}
}
return found;
},
lookupAll: function(myArray, searchTerm, property) {
return this.lookup(myArray, searchTerm, property, false);
},
remove: function(myArray, searchTerm, property, firstOnly) {
for (var i = myArray.length - 1; i >= 0; i--) {
if (myArray[i][property] === searchTerm) {
myArray.splice(i, 1);
if (firstOnly) break; //if only the first term has to be removed
}
}
},
contains: function(myArray, searchTerm, property){
return this.indexOf(myArray, searchTerm, property) !== -1;
}
};
答案 2 :(得分:0)
你可以在这里使用各种各样的东西,但也许some
就是你想要的。
if (!selectedUsers.some(function (user) {
return user.qid === $(this).val()
})) {
selectedUsers.push(...)
}
这就是说,如果数组中的所有项都没有匹配的qid,请推送新的。
写得更优雅:
var qid = $(this).val()
if (!selectedUsers.some(user => user.qid === qid) {
selectedUsers.push(..)
}