我最近一直在做大量的Ajax,并且使用我的很多域对象转换它们的JavaScript对应物。我发现自己编写了几个循环通过对象数组的函数来按属性值进行搜索。我决定编写一个简单的jQuery插件,它允许我搜索一个原始或复杂类型的数组。
注意:这是我第一次尝试编写jQuery插件。我不确定我是否以正确的方式去做。我主要担心的是搜索逻辑的效率和跨浏览器支持。
谢谢!
批评代码:
$(function() {
$.indexOfArray = function (search, array) {
var keys = [];
var index = -1;
var primitiveType = true;
for (var propertyName in search) {
primitiveType = false;
keys.push(propertyName);
}
if ($.isArray(array)) {
for (var a = 0; a < array.length; a++) {
var match = 0;
if (primitiveType && array[a] == search) {
index = a;
break;
}
else if (!primitiveType) {
for (var b = 0; b < keys.length; b++) {
if (search[keys[b]] == array[a][keys[b]]) {
match++;
}
}
if (match == keys.length) {
index = a;
break;
}
}
}
}
return index;
}
});
简单的使用示例(它也适用于基本类型数组,如字符串或整数):
var testArray = [{Id:1, FirstName: 'John'}, {Id:2, FirstName: 'Jake'}, {Id:2, FirstName: 'Jason'}];
var selectedPerson = testArray[$.indexOfArray({Id:2}, testArray)];
答案 0 :(得分:1)
就浏览器而言,你真的没有什么可担心的。
就效率而言,它并不坏,尽管您可能会使用缓存某些值,例如,您可以查找数组的.length属性。还有keys[b]
。
答案 1 :(得分:1)
非常好的插件。当你在它的时候把它发布在github上。有几件事:
不要调用函数indexOfArray
,因为它没有找到给定对象的索引,而是在给定部分/完整对象作为模板的情况下对键和值进行搜索。它还搜索基元,但这更多的是额外的奖励。在命名这个东西时,你不必遵循过去的约定。使用最能描述它的名称。
你可以在不声明keys
数组的情况下,并在那里的某些空间上空间。但这是微观优化,除非你处理非常大的物体。
这可能只是一厢情愿的想法,但是使用嵌套对象结构作为搜索键的搜索真的很棒:)
不错的插件和代码。在查询JSON文档时非常有用。