在javascript中我需要知道数组是否包含值。值是对象,我可以有相同对象的不同实例,这意味着$ .inArray(...)将不起作用。我知道如何使用$ .each(...)完成我的任务,我的问题是 - 是否可以通过值的比较逻辑将函数传递给任何jQuery方法(参见带有所需sintax的示例)?
// values
var val1 = { id: 1, description: 'First value'};
var val2 = { id: 2, description: 'Second value'};
var val3 = { id: 3, description: 'Third value'};
// array of values
var values = [ val1, val2, val3 ];
// inArray of jQuery to know if value is in array -> returns TRUE
var isInArray = $.inArray(val2, values) > -1;
// another instance of same object "val2"
var val2_anotherInstance = { id: 2, description: 'Second value'};
// inArray works as expected -> returns FALSE but desirable result is TRUE
var isInArray_anotherInstance = $.inArray(val2_anotherInstance, values) > -1;
// define function for comparing values (any logic can be implemented, for example searching by Id)
var valueComparer = function(first, second) {
return first.id == second.id && first.description == second.description;
}
// function compares objects and returns true for different instances
alert(valueComparer(val2, val2_anotherInstance));
// desirable sintax:
// is something like this possible ???
// NOTE next line not correct
isInArray_anotherInstance = $.inArray(val2_anotherInstance, values, valueComparer) > -1;
// actually what I want is specify criteria for searching value in array
答案 0 :(得分:2)
尝试grep:
var val1 = { id: 1, description: 'First value'};
var val2 = { id: 2, description: 'Second value'};
var val3 = { id: 3, description: 'Third value'};
var values = [ val1, val2, val3 ];
// another instance of same object "val2"
var val2_anotherInstance = { id: 2, description: 'Second value'};
var items = $.grep(values, function(x) {
return x.id == val2_anotherInstance.id
})
var found = items.length > 0
为了更加优雅,您可以使用this answer中提供的布尔聚合器函数:
val2_in_array = $.some(values, function() {
return this.id == val2_anotherInstance.id
});
答案 1 :(得分:1)
您可以将此功能用于您的任务:
$.fn.inArrayCallback = function(needle, haystack, f) {
var e = -1;
$.each(haystack,function(index, value){
if (f(needle,value)) { e = index; return false; }
});
return e;
}
ans = $.fn.inArrayCallback(val2_anotherInstance, values, valueComparer) > -1;
// returns true
使用 grep 函数回答将搜索数组中的所有元素,即使已找到匹配元素也是如此。此功能停止搜索匹配。这在非常大的阵列上可能很重要。
答案 2 :(得分:0)
您可以使用greep()函数过滤数组,然后计算生成数组中的项目数。但它会处理所有数组,如果你有大量数据,它将不会对性能友好。
答案 3 :(得分:0)
jquery map函数应该可以解决你的问题。 您可以在map的回调中实现比较逻辑。 refer jQuery map