在一个JavaScript对象的数组中通过ID查找对象
我有一个数组。
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
我无法改变这个数组的结构。我被传递了一个45'的id,我想在数组中获得该对象的
'bar''。
我如何在JavaScript中或使用jQuery来做这个?
1420
20
我有一个数组。
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
我无法改变这个数组的结构。我被传递了一个45'的id,我想在数组中获得该对象的
'bar''。
我如何在JavaScript中或使用jQuery来做这个?
由于你已经在使用jQuery,你可以使用grep函数,它是用来搜索一个数组的。
其结果是一个包含所找到的项目的数组。如果你知道这个对象一直在那里,而且只出现一次,你可以直接使用
result[0].foo
来获取值。否则你应该检查结果数组的长度。例子。使用
find()
方法。来自MDN。
如果你想找到它的index,请使用
findIndex()
。来自MDN。
如果你想得到一个匹配元素的数组,请使用
filter()
方法代替。这将返回一个对象的数组。如果你想获得一个
foo'属性的数组,你可以用[
map()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)方法来实现。题外话:像
find()
或filter()
这样的方法,以及箭头函数不被旧的浏览器支持(如IE),所以如果你想支持这些浏览器,你应该用Babel转译你的代码(用polyfill)。另一种解决方案是创建一个查找对象。
如果你需要做许多查找,这一点尤其有趣。
这不会需要更多的内存,因为ID和对象将被共享。
ECMAScript 2015提供了关于数组的[find()][1]方法。
<!--开始片段。 js hide: false console: true babel: false -->
<!--结束片段-->。
它可以在没有外部库的情况下工作。 但如果你想要[旧版浏览器支持][2],你可能需要包含[这个polyfill][3]。
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find [2]: http://kangax.github.io/compat-table/es6/#Array.prototype_methods [3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill
[Underscore.js][1]有一个不错的方法。
[1]: http://underscorejs.org/#find
我认为最简单的方法是下面的方法,但它在Internet Explorer 8(或更早)上无法工作。
试试下面的方法
上面的findById函数的一个通用且更灵活的版本。
你可以使用[map()][1]函数轻松获得。
工作实例。 http://jsfiddle.net/hunter/Pxaua/
[1]: http://api.jquery.com/jQuery.map/
你可以使用过滤器。
虽然这里有许多正确的答案,但其中许多答案并没有解决这样一个事实,即如果不止一次这样做,这是一个不必要的昂贵操作。 在一个极端的情况下,这可能是真正的性能问题的原因。
在现实世界中,如果你要处理大量的项目,并且考虑到性能问题,那么最初建立一个查找就会快得多。
然后你可以在固定的时间内得到像这样的项目。
你也可以考虑使用一个地图而不是一个对象作为查找对象。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
使用本地
Array.reduce
<!-->
如果找到,则返回对象元素,否则返回
false
。如果你多次这样做,你可能会设置一个地图(ES6)。
那么你就可以简单的做。
下面是我如何在纯JavaScript中,以我能想到的最简陋的方式,在ECMAScript 3或更高版本中工作。 一旦发现匹配,它就会返回。
更加通用和简短
在你的例子中,Ex.Implement = findFromArray(myArray,'id',45)
将得到整个元素。
var element = findFromArray(myArray,'id',45)` 这将给你整个元素。在公认的答案的基础上。
jQuery。
或者CoffeeScript。
你可以试试http://sugarjs.com/ 的 Sugarjs。
它在数组上有一个很好的方法,
.find
。 所以你可以像这样找到一个元素。你也可以通过一个有更多属性的对象来增加另一个"where-clause"。
注意,Sugarjs扩展了原生对象,有些人认为这是非常邪恶的...。
只要浏览器支持[ECMA-262][1],第5版(2009年12月),应该就可以了,几乎是一言九鼎。
[1]: https://en.wikipedia.org/wiki/ECMAScript#Versions
你甚至可以通过使用内置的"filter".函数在纯JavaScript中实现这一点。 函数来处理数组。
因此,现在只需通过"id".来代替
key
和"45"。 代替key
和"45" 代替value
,你将得到与id为45相匹配的完整对象。 所以,这将是。