我有一个数组:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
我无法更改阵列的结构。我收到了一个45的id,我想得到数组中该对象的“bar”。
如何在JavaScript或使用jQuery实现这一点?
我有一个数组:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]
我无法更改阵列的结构。我收到了一个45的id,我想得到数组中该对象的“bar”。
如何在JavaScript或使用jQuery实现这一点?
当前回答
使用find()方法:
myArray.find(x => x.id === '45').foo;
来自MDN:
如果数组中的元素满足所提供的测试函数,find()方法将返回数组中的第一个值。否则返回undefined。
如果要查找其索引,请使用findIndex():
myArray.findIndex(x => x.id === '45');
来自MDN:
findIndex()方法返回数组中满足所提供测试函数的第一个元素的索引。否则返回-1。
如果要获取匹配元素的数组,请改用filter()方法:
myArray.filter(x => x.id === '45');
这将返回一个对象数组。如果要获取foo财产数组,可以使用map()方法:
myArray.filter(x => x.id === '45').map(x => x.foo);
附带说明:旧浏览器(如IE)不支持find()或filter()和arrow函数等方法,因此如果您想支持这些浏览器,应该使用Babel(带有polyfill)来转换代码。
其他回答
查找数组索引的方法:
index = myArray.map((i) => i.id).indexOf(value_of_id);
item = myArray[index];
考虑“axesOptions”是对象数组,对象格式为{:字段类型=>2,:字段=>[1,3,4]}
function getFieldOptions(axesOptions,choice){
var fields=[]
axesOptions.each(function(item){
if(item.field_type == choice)
fields= hashToArray(item.fields)
});
return fields;
}
使用jQuery的过滤方法:
$(myArray).filter(function()
{
return this.id == desiredId;
}).first();
这将返回具有指定Id的第一个元素。
它还具有良好的C#LINQ格式的优点。
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
动态缓存查找
在这个解决方案中,当我们搜索某个对象时,我们将其保存在缓存中。这是“始终搜索解决方案”和“为预先计算的每个对象创建哈希图”之间的中间点。
让cachedFind=(()=>{let cache=new Map();return(arr,id,el=null)=>cache.get(id)||(el=arr.find(o=>o.id==id),cache.set(id,el),el);})();// ---------//测试// ---------let myArray=[…Array(100000)].map((x,i)=>({‘id‘:‘${i}‘,‘foo‘:‘bar_${i}‘}));//示例用法console.log(cachedFind(myArray,'1234').foo);//基准让板凳=(id)=>{console.time('time for'+id);console.log(cachedFind(myArray,id).foo);//查找console.timeEnd('time for'+id);}console.log('-----无缓存-----');工作台(50000);工作台(79980);工作台(99990);console.log('-----缓存-----');工作台(79980);//高速缓存的工作台(99990);//高速缓存的