更好的方法在数组中找到对象而不是循环?

Ron*_*den 6 javascript arrays jquery object

链接: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
})
Run Code Online (Sandbox Code Playgroud)

问题

在上面的例子中,我有一个包含对象的数组.我需要找到有的对象name = 'John Doo'

我的.each循环正在工作,但这部分将执行100次,测试将包含更多的对象.所以我认为这种方式会很慢.

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

如何name = 'John Doo'在当前数组中搜索对象?

Mat*_*eri 7

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

Lo-Dash (www.lodash.com)创建了utils选项,可以轻松循环等.查看它!

注意:但通常你真的不必担心使用100个元素循环使用数组.

  • 例如,如果您的数组已经排序,可以告诉Lo-Dash的_.indexOf().然后它会通过你的数组使用二进制搜索(非常快). (2认同)

Luc*_*oli 7

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

}
Run Code Online (Sandbox Code Playgroud)

  • Ehy Bondye,不客气.我非常好奇你所说的关于预增量比后增量更快的内容,但事实证明这只适用于gcc编译器,它"用于生成后增量的次优代码和这就是为什么使用预增量的原因.编译器已经走过了漫长的道路,程序员不需要以奇怪的方式思考智能编程器了." 如今,它是一种传奇.虽然有趣但:) (3认同)