nak*_*hli 9 javascript jquery underscore.js
我需要与Underscore的查找基本相同的功能,但结果是元素的索引(而不是元素本身).
据我所知,Underscore的indexOf寻找一个值并且没有函数.jQuery的inArray函数也存在同样的问题.
我提出了以下实现,但我不确定它是最有效的:
function myIndexOf(arr, filter) {
var index;
$.each(arr, function (i, elt) { if (filter(elt)) { index=i; return false; } });
return index;
}
Run Code Online (Sandbox Code Playgroud)
Pao*_*tti 10
_.findIndex在Lo-Dash和Underscore.js中可用:
var characters = [
{ 'name': 'barney', 'age': 36, 'blocked': false },
{ 'name': 'fred', 'age': 40, 'blocked': true },
{ 'name': 'pebbles', 'age': 1, 'blocked': false }
];
_.findIndex(characters, function(chr) {
return chr.age < 20;
});
// ? 2
_.findIndex(characters, { 'age': 36 });
// ? 0
_.findIndex(characters, { 'name': 'dino' });
// ? -1 (not found)
Run Code Online (Sandbox Code Playgroud)
这是一个简单的实现:
function find(collection, filter) {
for (var i = 0; i < collection.length; i++) {
if(filter(collection[i], i, collection)) return i;
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
它适用于任何具有length属性的可索引对象,并且您可以传递表单的复杂过滤器函数filter(element, index, collection)(可选参数).
Underscore使用以下实现:
_.find = function(obj, iterator, context) {
var result;
_.any(obj, function(value, index, list) {
if(iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
这反过来调用,_.any哪些调用_.each,哪些调用Array.prototype.forEach.效率并不完全是游戏的名称.它更多的是实用性.
如果你知道你正在处理一个数组或类似数组的对象,你可以使用@ Thor84no的解决方案,只需循环遍历数组,直到满足你的过滤条件.如果没有,你也可能正在处理对象,我只需将_.find重写为_.findIndex并使用result = index;.