我有一个数组:
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实现这一点?
当前回答
此解决方案也可能有帮助:
Array.prototype.grep = function (key, value) {
var that = this, ret = [];
this.forEach(function (elem, index) {
if (elem[key] === value) {
ret.push(that[index]);
}
});
return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");
我将其设置为$.grep,如果找到一个对象,函数将返回该对象,而不是数组。
其他回答
下面的代码将帮助您从数据中的嵌套对象中搜索值。
const updatedData = myArrayOfObjects.filter((obj: any) => Object.values(obj).some((val: any) => {
if (typeof (val) == typeof ("str")) {
return val.toString().includes(Search)
} else {
return Object.values(val).some((newval: any) => {
if (newval !== null) {
return newval.toString().includes(Search)
}
})
}
}))
尝试以下操作
function findById(source, id) {
for (var i = 0; i < source.length; i++) {
if (source[i].id === id) {
return source[i];
}
}
throw "Couldn't find object with id: " + id;
}
正如其他人所指出的,.find()是在数组中查找一个对象的方法。但是,如果无法使用此方法找到对象,则程序将崩溃:const myArray=[{'id':'73','o':'bar'},{'id':'45','o':'bar'}];const res=myArray.find(x=>x.id=='100').foo;//噢!/*错误:“Uncaught TypeError:无法读取未定义的属性'foo'”或在较新的chrome版本中:Uncaught TypeError:无法读取未定义的的财产(读取“foo”)*/
这可以通过在使用.foo之前检查.find()的结果是否已定义来解决。Modern JS允许我们通过可选链接轻松完成这一点,如果找不到对象,则返回undefined,而不是崩溃代码:
const myArray=[{'id':'73','o':'bar'},{'id':'45','o':'bar'}];const res=myArray.find(x=>x.id=='100')?。foo;//没有错误!console.log(res);//找不到对象时未定义
ECMAScript 2015(JavaScript ES6)提供find()数组上的方法:
var myArray=[{id:1,name:“bob”},{id:2,名称:“dan”},{id:3,名称:“barb”},]//抓取与id“2”匹配的Array项var item=myArray.find(item=>item.id===2);//打印console.log(item.name);
它在没有外部库的情况下工作。但是,如果您想要更旧的浏览器支持,您可能需要包含此polyfill。
从aggaton的答案开始,这是一个实际返回所需元素(如果找不到则返回null)的函数,给定数组和一个回调函数,该函数返回“正确”元素的truthy值:
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
请记住,这在IE8-上本就不起作用,因为它不支持某些功能。可以提供polyfill,或者总是有经典的for循环:
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
它实际上更快、更紧凑。但如果你不想重新发明轮子,我建议使用下划线或lodash之类的实用程序库。