Answers:
使用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);
附注:方法,如find()
或filter()
和箭头的功能不被旧的浏览器(如IE)的支持,所以如果你想支持这些浏览器,你应该使用transpile代码巴贝尔(用填充工具)。
由于您已经在使用jQuery,因此可以使用旨在搜索数组的grep函数:
var result = $.grep(myArray, function(e){ return e.id == id; });
结果是包含找到的项目的数组。如果您知道对象始终存在并且只发生一次,则可以使用result[0].foo
来获取值。否则,您应该检查结果数组的长度。例:
if (result.length === 0) {
// no result found
} else if (result.length === 1) {
// property found, access the foo property using result[0].foo
} else {
// multiple items found
}
===
代替会更安全==
,以避免JavaScript ==
运算符出现奇怪的问题。
e.id
和id
都将是字符串,那么我想可以使用==
。但是,如果不确定,您可能会遇到问题(因为'' == 0
是,true
但是'' === 0
是false
)。更不用说===
似乎更快了(stackoverflow.com/questions/359494/…)。
===
它,因为它的工作方式与其他编程语言完全相同==
。我认为==
JavaScript不存在。
另一个解决方案是创建一个查找对象:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
如果您需要进行许多查找,这尤其有趣。
由于ID和对象将被共享,因此不需要更多的内存。
lookup
对象就是浪费时间。
ECMAScript 2015在数组上提供了find()方法:
var myArray = [
{id:1, name:"bob"},
{id:2, name:"dan"},
{id:3, name:"barb"},
]
// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);
// print
console.log(item.name);
myArray.find(d=>d.id===45).foo;
。
Underscore.js有一个不错的方法:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
我认为最简单的方法是以下操作,但在Internet Explorer 8(或更早版本)上将无法使用:
var result = myArray.filter(function(v) {
return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property
for
吗?
for
循环相比,它不会真正快。
for
循环将在第一个匹配项时终止。
id
尝试以下
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;
}
myArray.filter(function(a){ return a.id == some_id_you_want })[0]
上面的findById函数的通用且更灵活的版本:
// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
for (var i = 0; i < array.length; i++) {
if (array[i][key] === value) {
return array[i];
}
}
return null;
}
var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');
您可以使用map()函数轻松获得此信息:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var found = $.map(myArray, function(val) {
return val.id == 45 ? val.foo : null;
});
//found[0] == "bar";
工作示例:http : //jsfiddle.net/hunter/Pxaua/
map
自动删除null
元素的事实。这听起来对我和的通用概念都具有误导性map
,因为结果与原始系列的长度不同。
尽管这里有许多正确的答案,但其中有许多并没有解决这样的事实,即如果进行多次以上,这将是不必要的昂贵操作。在极端情况下,这可能是造成实际性能问题的原因。
在现实世界中,如果您要处理很多项目,而性能是一个问题,那么最初构建查找的速度会更快:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
然后,您可以像这样在固定时间获取物品:
var bar = o[id];
您可能还考虑使用Map而不是对象作为查询:https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
Array.reduce
var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
return (a.id==id && a) || (b.id == id && b)
});
返回object元素(如果找到),否则返回 false
这是我将以纯JavaScript进行处理的方式,我可以想到的最低限度的方式适用于ECMAScript 3或更高版本。找到匹配项后立即返回。
var getKeyValueById = function(array, key, id) {
var testArray = array.slice(), test;
while(test = testArray.pop()) {
if (test.id === id) {
return test[key];
}
}
// return undefined if no matching id is found in array
return;
}
var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');
// result is 'bar', obtained from object with id of '45'
更通用,更简短
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
在您的情况下 var element = findFromArray(myArray,'id',45)
这将为您提供整个元素。
您可以从http://sugarjs.com/尝试使用Sugarjs。
它对Arrays有很好的方法.find
。因此,您可以找到这样的元素:
array.find( {id: 75} );
您还可以将具有更多属性的对象传递给它,以添加另一个“ where-clause”。
请注意,Sugarjs扩展了本机对象,有些人认为这非常邪恶。
find
。我的建议是,如果要扩展本机原型,请始终使用更特定的名称,而将最简单的名称留给将来的标准开发。
最近,我不得不面对同样的事情,我需要从一个巨大的数组中搜索字符串。
经过一番搜索,我发现使用简单的代码将很容易处理:
码:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
遍历数组中的任何项目。对于您访问的每个商品,请检查该商品的ID。如果匹配,则返回。
如果您只想编码:
function getId(array, id) {
for (var i = 0, len = array.length; i < len; i++) {
if (array[i].id === id) {
return array[i];
}
}
return null; // Nothing found
}
使用ECMAScript 5的Array方法也是一样:
function getId(array, id) {
var obj = array.filter(function (val) {
return val.id === id;
});
// Filter returns an array, and we just want the matching item.
return obj[0];
}
只要浏览器支持ECMA-262,第5版(2009年12月),它就可以工作,几乎只有一种形式:
var bFound = myArray.some(function (obj) {
return obj.id === 45;
});
bFound
只是一个布尔值,true
表示元素满足所需条件。
您甚至可以通过使用内置的数组“过滤器”函数在纯JavaScript中执行此操作:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
因此,现在只需传递“ id”代替,key
并传递“ 45”代替value
,您将获得匹配id为45的完整对象。
myArr.filterObjects("id", "45");
采用 Array.prototype.filter()
功能。
演示:https : //jsfiddle.net/sumitridhal/r0cz0w5o/4/
JSON格式
var jsonObj =[
{
"name": "Me",
"info": {
"age": "15",
"favColor": "Green",
"pets": true
}
},
{
"name": "Alex",
"info": {
"age": "16",
"favColor": "orange",
"pets": false
}
},
{
"name": "Kyle",
"info": {
"age": "15",
"favColor": "Blue",
"pets": false
}
}
];
过滤
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
方法obj.info
。 var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
我们可以使用Jquery方法 $.each()/$.grep()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
要么
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
使用ES6语法:
Array.find, Array.filter, Array.forEach, Array.map
或使用Lodash https://lodash.com/docs/4.17.10#filter,下划线https://underscorejs.org/#filter
我真的很喜欢亚伦·迪古拉(Aaron Digulla)提供的答案,但需要保留我的对象数组,以便稍后进行迭代。所以我修改为
var indexer = {};
for (var i = 0; i < array.length; i++) {
indexer[array[i].id] = parseInt(i);
}
//Then you can access object properties in your array using
array[indexer[id]].property
采用:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
它应该通过id返回一个对象。
此解决方案也可能有帮助:
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
,如果找到一个对象,函数将返回该对象,而不是数组。
function will return the object, rather than an array
可能会出错,但是我认为这取决于用户。
从aggaton的答案开始,这是一个实际上返回null
给定元素(如果没有找到的话)array
的callback
函数,并且给出了一个返回“正确”元素的真实值的函数:
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
只需记住,这在IE8-上本身不起作用,因为它不支持some
。可以提供一个polyfill,或者总是有经典的for
循环:
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
实际上,它更快,更紧凑。但是,如果您不想重新发明轮子,建议您使用下划线或lodash之类的实用程序库。
最短的
var theAnswerObj = _.findWhere(array, {id : 42});