我有一个JSON对象数组,我想找到具有特定属性的对象。我知道这看起来像是一个重复的问题,但请继续,因为我认为它与之前的问题略有不同。
与我一起工作的一个人建议使用IndexOf,这让我开始思考。mongo中有类似于$ elemMatch功能的东西吗?是否有一些命令基本上用伪代码表示“从此数组中获取具有此属性的对象”?通过迭代,我感觉伪代码说“看一下该数组中的第一个对象。如果此对象具有此属性,请给我这个对象。否则,请看此数组中的第二个对象..... ”
我理解如何像朋友建议的那样使用IndexOf,但是我考虑得越多,我开始想到IndexOf方法可能会减少代码行的数量,但是最终它不必遍历数组中的对象来找到它我需要的那个的索引?因此,如果我想对具有此属性的对象进行某些操作,并且使用IndexOf方法获取索引,则可以引用myArray [indexFromIndexOfMethod]之类的对象,然后相应地对其进行修改,对吗?因此,如果javascript遍历数组本身以执行IndexOf方法,为什么不只编写自己的迭代并保存步骤呢?现在,如果IndexOf方法使用一种比仅遍历并检查每个数组元素更有效的方法来定位数组元素,那么使用它对我来说是有意义的。除此以外,
Array.prototype.indexOf
也只是遍历数组并返回具有匹配值的第一个索引。您可以对循环执行相同的操作。它可能比for
循环快,也可能不会比循环快,因为它indexOf
可以用本机代码实现,并且与for
循环可以优化的方式不同,但是没有根本区别。
如果您经常需要尽快访问特定值,则值得通过对象中的该值对其进行索引。意思是,如果要.foo
经常通过属性查找特定对象,请执行以下操作:
var byFoo = {} for (var i = 0; i < myArray.length; i++) { byFoo[myArray[i].foo] = myArray[i]; }
然后,您可以使用进行即时访问byFoo['baz']
。
当然,这可能会带来额外的开销,即可能在多个副本中维护这些索引,但是它将以许多幅度加快阵列访问速度。您需要权衡利弊。