Javascript 在数组中查找对象而不是循环的更好方法? 例子

Javascript 在数组中查找对象而不是循环的更好方法? 例子,javascript,jquery,arrays,object,Javascript,Jquery,Arrays,Object,链接: 问题 在上面的示例中,我有一个包含对象的数组。我需要找到具有name='John Doo' My。每个循环都在工作,但此部分将执行100次,测试将包含更多的对象。所以我认为这条路会很慢 indexOf()无法工作,因为我无法在对象中搜索名称 问题: 如何在当前数组中搜索名为“John Doo”的对象?也许您应该使用jQuery中的$.grep功能: var test = [{ "name": "John Doo" }, { "name": "Foo Bar" }] va

链接:

问题 在上面的示例中,我有一个包含对象的数组。我需要找到具有
name='John Doo'

My
。每个
循环都在工作,但此部分将执行100次,测试将包含更多的对象。所以我认为这条路会很慢

indexOf()
无法工作,因为我无法在对象中搜索名称

问题:
如何在当前数组中搜索名为“John Doo”的对象?

也许您应该使用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);
小提琴手:

在这种情况下,我有时会做“可搜索地图对象”。如果数组本身是静态的,则可以转换为映射,其中数组值可以是键,映射值可以是索引。我假设值是唯一的,如您的示例中所示

Lo破折号)创建了UTIL选项,以方便循环等。请查看


注意:但通常情况下,您不必担心使用100个元素循环槽数组。

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

}
var getObjectByName=函数(名称、数组){
//(!)将数组长度缓存在变量中
对于(变量i=0,len=test.length;i
您唯一可以做的就是优先使用内置数组方法(如果可用),而不是自己进行循环–该方法在这里适用


但是我希望像sbeliv01在回答中使用的jQuery这样的JS库已经在内部检查了这一点(如果这些数组方法本机不可用,则提供一个回退解决方案),因此不要期望性能得到大幅提升。

如果您只想知道值是否存在,您可以像这样使用lodash的
includes
功能:

var find = 'John Doo'

[{ "name": "John Doo" }, { "name": "Foo Bar" }].some(function (hash) {
    if (_.includes(hash, find)) return true;
});
文件:


使用
for
循环(而不是
for in
)来提高性能,并在找到匹配项后立即中断
。除非您的数组按该
名称排序,或者您有另一个数据结构(如按名称键入的映射),否则无法找到它,除了彻底的搜索。重复的如果你说循环本身将被执行100次,那么我猜还有其他的优化方法,但是需要更多的信息。@Bondye-你能控制数据的结构吗?如果名称是唯一的,并且您可以将它们作为其他数据的键,那么就有可能大大简化它。例如ux。如果数组已排序,则可以告知Lo Dash的indexOf()。然后它将使用二进制搜索通过你的数组(非常快)。不知道为什么这个答案被否决。这是一个非常好的解决方案。如果您需要在同一个数组上搜索多次,这是一个快速的解决方案,但是请注意,如果您处理大型数组,它可能会在内存方面花费很多,因为您必须构建另一个内存中对象。将数组转换为map的时间开销始终为O(n),而不仅仅是在老式for循环的最坏情况下。一旦转换,此解决方案将导致O(1)次执行。如果只需要搜索一次,或者担心内存问题,最好使用for循环方法。这不会比循环更有效。我不知道你为什么接受它作为你的答案。它不能提高性能。此函数“过滤”一个数组,返回另一个数组,而不是对象本身。这意味着它将处理整个数组,在找到搜索的元素时不会中断循环执行。filter方法遇到与$.grep()相同的问题:它将循环所有数组对象。Ehy Bondye,不客气。我对你所说的前增量比后增量快感到非常好奇,但事实证明,这只适用于gcc编译器,这是真的“用于为增量后生成次优代码,这就是为什么当时使用了增量前代码。编译器已经走过了很长的一段路,程序员不需要再以奇怪的方式思考来智胜编译器了”
var find = 'John Doo'

[{ "name": "John Doo" }, { "name": "Foo Bar" }].some(function (hash) {
    if (_.includes(hash, find)) return true;
});