2016-04-21 117 views
0

我有一个包含用户帐户和复选框的页面。保存时,我需要将复选框的所有值添加到对象中,只要它们不存在于其中即可。jQuery检查值是否在对象中

当我使用关联数组时,我有这个工作,因为我当时只存储了一个值。我现在将它作为一个对象存储,并且我需要确保该对象中不存在QID(这是唯一的)。

有没有一种优雅的方法来解决这个问题?

var selectedUsers = []; 

$(tab).find(".cb:checked").each(function() { 
     // If the QID is not already in the array, add it 
     if(jQuery.inArray($(this).val(), selectedUsers) === -1) { 
      selectedUsers.push({ 
       "qid": $(this).val(), 
       "first": $(this).data('emp_first'), 
       "last": $(this).data('emp_last'), 
       "department": $(this).data('emp_dept') 
      }); 
     } 
    }); 
+0

也许你不需要if条件 –

+0

JS实际上并没有关联数组......如果你有字符串键,那么你需要一个常规的对象,而不是一个数组。我建议为选定的用户创建一个对象而不是数组,然后你可以通过qid来索引它。 –

+1

在我看来,这里的对象阵列还是比较好的。毕竟,这是一个用户列表。 – azium

回答

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'; 
    } 
}); 
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(..) 
} 
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); 

或使用包含:

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; 
    } 
}; 
+0

这是一个非常深思熟虑的回应,但很多这些东西都是在原生JS中实现的。我认为你可以完成每一个没有一个'for'循环。 – azium

+0

向后兼容旧版浏览器,我测试了它们的速度,即使是针对Chrome中的某些本地内容,也发现它在很多情况下速度更快或更快。即map和.keys等。即使是本地的,也需要以某种方式循环迭代。 –

+0

例如对于1200个匹配的对象的10,000个对象lookupAll Took:0.7949999999999591msecs found:1200 –