在数组中查找对象的更好方法,而不是循环
Better way to find object in array instead of looping?
示例
链接:http://jsfiddle.net/ewBGt/
var test = [{
"name": "John Doo"
}, {
"name": "Foo Bar"
}]
var find = 'John Doo'
console.log(test.indexOf(find)) // output: -1
console.log(test[find]) // output: undefined
$.each(test, function(index, object) {
if(test[index].name === find)
console.log(test[index]) // problem: this way is slow
})
问题
在上面的例子中,我有一个带有对象的数组。我需要找到具有name = 'John Doo'
的对象
我的.each
循环正在工作,但这部分将被执行100次,并且测试将包含更多的对象。所以我认为这种方式会很慢。
indexOf()
无法工作,因为我无法在对象中搜索名称。
问题
如何在当前数组中搜索具有name = 'John Doo'
的对象?
jQuery $.grep
(或其他过滤函数(不是最佳解决方案。
$.grep
函数将循环遍历数组的所有元素,即使在循环过程中已经找到搜索到的对象。
来自jQuery grep文档:
$.grep((方法根据需要从数组中删除项,以便所有剩余的项目都通过了提供的测试。测试是一个功能传递一个数组项和该数组中该项的索引。只有当测试返回true时,该项才会出现在结果数组中。
假设你的数组没有排序,没有什么能比得上这个:
var getObjectByName = function(name, array) {
// (!) Cache the array length in a variable
for (var i = 0, len = test.length; i < len; i++) {
if (test[i].name === name)
return test[i]; // Return as soon as the object is found
}
return null; // The searched object was not found
}
在这种情况下,我有时会做"可搜索的地图对象"。如果数组本身是静态的,则可以转换为映射,其中数组值可以是键,映射值可以是索引。我认为价值观是独一无二的,就像你的例子一样。
Lo Dash(www.lodash.com(为轻松循环等创建了一系列实用程序。看看吧!
注意:但通常您不必担心循环使用具有100个元素的数组。
如果你只想知道值是否存在,你可以使用lodash的includes
函数,如下所示:
var find = 'John Doo'
[{ "name": "John Doo" }, { "name": "Foo Bar" }].some(function (hash) {
if (_.includes(hash, find)) return true;
});
文件:
- _.includes((
- Array.prototype.some((
也许您应该在jQuery:中使用$.grep
功能
var test = [{
"name": "John Doo"
}, {
"name": "Foo Bar"
}]
var find = 'John Doo'
var found = $.grep(test, function(obj){
return obj['name'] == find;
});
console.log(found);
Fiddle:http://jsfiddle.net/ewBGt/3/
您唯一能做的就是优先使用内置数组方法(如果可用(,而不是自己进行循环——filter
方法在这里适用。
但我预计,像sbeliv01在他的回答中使用的jQuery这样的JS库已经在内部检查了这一点(如果这些数组方法在本机中不可用,则提供一个后备解决方案(,所以不要指望会有巨大的性能提升。
- Array方法中的Javascript循环
- 如何在循环中使用jQuery.on()方法,而不覆盖我循环的对象
- 有没有一种方法可以在所有嵌套循环之后放置一个标签,以便在一步中将它们全部打断
- 特定循环(html元素)方法的优点和缺点
- MeteorJS使用流星调用和流星方法时的无限循环
- 使用click()方法是在创建一个无休止的循环
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议
- 循环遍历 DOM 元素时,是否有 for 循环的替代方法
- 在二维数组中搜索比嵌套循环更有效的方法
- 在Raphael JS中创建脉动(循环)背景的最简单方法
- 有没有任何方法可以使这个名称生成循环运行最短的秒数
- 对于许多类似的方法,使用for循环
- 可以't在对象数组上循环时调用公共方法
- Node.js:如何在一个循环中使用回调调用方法
- 在循环中创建函数的最有效替代方法
- JavaScript 将循环遍历数组的函数传递给使用 Switch 语句日期方法的函数
- RequireJS,循环依赖和导出“魔术”方法
- 每次迭代在 Foreach 循环中重复 PHP 睡眠方法
- 在nodejs中使用Q.js承诺进行循环的正确方法
- 在c#中创建一个自循环方法