Câu trả lời:
Sử dụng find()
phương pháp:
myArray.find(x => x.id === '45').foo;
Từ MDN :
Các
find()
phương thức trả về giá trị đầu tiên trong mảng, nếu một phần tử trong mảng thoả mãn được cung cấp chức năng kiểm tra. Nếu không thìundefined
được trả lại.
Nếu bạn muốn tìm chỉ mục của nó thay vào đó, hãy sử dụng findIndex()
:
myArray.findIndex(x => x.id === '45');
Từ MDN :
Các
findIndex()
phương thức trả về chỉ số của phần tử đầu tiên trong mảng đó đáp ứng các quy định chức năng kiểm tra. Nếu không -1 được trả về.
Nếu bạn muốn có được một mảng các phần tử phù hợp, hãy sử dụng filter()
phương thức thay thế:
myArray.filter(x => x.id === '45');
Điều này sẽ trả về một mảng các đối tượng. Nếu bạn muốn có được một mảng các foo
thuộc tính, bạn có thể làm điều này với map()
phương thức:
myArray.filter(x => x.id === '45').map(x => x.foo);
Lưu ý bên lề: các phương thức như find()
hoặc filter()
, và các hàm mũi tên không được hỗ trợ bởi các trình duyệt cũ hơn (như IE), vì vậy nếu bạn muốn hỗ trợ các trình duyệt này, bạn nên sao chép mã của mình bằng Babel (với polyfill ).
Vì bạn đã sử dụng jQuery, bạn có thể sử dụng hàm grep dành cho tìm kiếm một mảng:
var result = $.grep(myArray, function(e){ return e.id == id; });
Kết quả là một mảng với các mục được tìm thấy. Nếu bạn biết rằng đối tượng luôn ở đó và nó chỉ xảy ra một lần, bạn chỉ có thể sử dụng result[0].foo
để nhận giá trị. Nếu không, bạn nên kiểm tra độ dài của mảng kết quả. Thí dụ:
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
}
===
thay vì ==
, để tránh các sự cố kỳ lạ với ==
toán tử JavaScript .
e.id
và id
sẽ là chuỗi, tôi cho rằng nó ổn để sử dụng ==
. Nhưng nếu bạn không chắc chắn, bạn có thể phải đối mặt với vấn đề (vì '' == 0
là true
nhưng '' === 0
là false
). Chưa kể ===
dường như nhanh hơn ( stackoverflow.com/questions/359494/ mài ).
===
vì nó hoạt động chính xác như ==
trong các ngôn ngữ lập trình khác. Tôi coi ==
là không tồn tại trong JavaScript.
Một giải pháp khác là tạo một đối tượng tra cứu:
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
... now you can use lookup[id]...
Điều này đặc biệt thú vị nếu bạn cần làm nhiều tra cứu.
Điều này sẽ không cần nhiều bộ nhớ hơn vì ID và đối tượng sẽ được chia sẻ.
lookup
đối tượng là một sự lãng phí thời gian.
ECMAScript 2015 cung cấp phương thức find () trên mảng:
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);
Nó hoạt động mà không cần thư viện bên ngoài. Nhưng nếu bạn muốn hỗ trợ trình duyệt cũ hơn, bạn có thể muốn bao gồm polyfill này .
myArray.find(d=>d.id===45).foo;
.
myArray.find(({ id }) => id === 45).foo
. Nhưng đây là một câu trả lời cũ đã được viết trước khi cú pháp ES2015 được hỗ trợ tốt như bây giờ. Câu trả lời của @ Gothdo hiện là cập nhật nhất trong chuỗi.
myArray.find(d => d.id === 45)?.foo
.
Underscore.js có một phương thức hay cho việc đó:
myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })
Tôi nghĩ cách dễ nhất sẽ là như sau, nhưng nó sẽ không hoạt động trên Internet Explorer 8 (hoặc sớm hơn):
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
vòng lặp trực tiếp .
for
vòng lặp sẽ chấm dứt ở trận đấu đầu tiên.
id
Hãy thử như sau
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]
Một phiên bản chung và linh hoạt hơn của hàm findById ở trên:
// 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');
Bạn có thể dễ dàng nhận được điều này bằng cách sử dụng hàm 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";
Ví dụ hoạt động: http://jsfiddle.net/hunter/Pxaua/
map
tự động loại bỏ null
các phần tử. Nghe có vẻ sai lệch đối với tôi và với khái niệm chung map
, vì kết quả không cùng độ dài của bộ sưu tập ban đầu.
Bạn có thể sử dụng các bộ lọc,
function getById(id, myArray) {
return myArray.filter(function(obj) {
if(obj.id == id) {
return obj
}
})[0]
}
get_my_obj = getById(73, myArray);
Mặc dù có nhiều câu trả lời đúng ở đây, nhiều trong số chúng không đề cập đến thực tế rằng đây là một hoạt động tốn kém không cần thiết nếu được thực hiện nhiều lần. Trong một trường hợp cực đoan, điều này có thể là nguyên nhân của các vấn đề hiệu suất thực sự.
Trong thế giới thực, nếu bạn đang xử lý nhiều vật phẩm và hiệu suất là một mối lo ngại thì ban đầu sẽ nhanh hơn nhiều để xây dựng một tra cứu:
var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var lookup = items.reduce((o,i)=>o[i.id]=o,{});
sau đó bạn có thể nhận được tại các mục trong thời gian cố định như thế này:
var bar = o[id];
Bạn cũng có thể xem xét sử dụng Bản đồ thay vì một đối tượng như tra cứu: 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)
});
trả về phần tử đối tượng nếu tìm thấy, nếu không false
Nếu bạn làm điều này nhiều lần, bạn có thể thiết lập Bản đồ (ES6):
const map = new Map( myArray.map(el => [el.id, el]) );
Sau đó, bạn có thể chỉ cần làm:
map.get(27).foo
Đây là cách tôi tìm hiểu về JavaScript thuần túy, theo cách tối thiểu nhất tôi có thể nghĩ về nó hoạt động trong ECMAScript 3 trở lên. Nó trở lại ngay sau khi một trận đấu được tìm thấy.
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'
Chung chung và ngắn gọn hơn
function findFromArray(array,key,value) {
return array.filter(function (element) {
return element[key] == value;
}).shift();
}
trong trường hợp của bạn var element = findFromArray(myArray,'id',45)
Điều đó sẽ cung cấp cho bạn toàn bộ yếu tố.
Bạn có thể dùng thử Sugarjs từ http://sugarjs.com/ .
Nó có một phương pháp rất ngọt ngào trên Mảng , .find
. Vì vậy, bạn có thể tìm thấy một yếu tố như thế này:
array.find( {id: 75} );
Bạn cũng có thể truyền một đối tượng có nhiều thuộc tính cho nó để thêm "mệnh đề where" khác.
Lưu ý rằng Sugarjs mở rộng các đối tượng bản địa và một số người cho rằng điều này rất xấu xa ...
find
là những gì đã xảy ra . Đề nghị của tôi là nếu bạn muốn mở rộng các nguyên mẫu bản địa, hãy luôn sử dụng các tên cụ thể hơn, để lại các tên đơn giản nhất cho các phát triển tiêu chuẩn trong tương lai.
Dựa trên câu trả lời được chấp nhận:
jQuery:
var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)
Hoặc CoffeeScript:
foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo
Gần đây, tôi phải đối mặt với điều tương tự mà tôi cần tìm kiếm chuỗi từ một mảng lớn.
Sau một số tìm kiếm tôi thấy Sẽ dễ dàng xử lý với mã đơn giản:
Mã số:
var items = mydata.filter(function(item){
return item.word.toLowerCase().startsWith( 'gk );
})
Lặp lại bất kỳ mục nào trong mảng. Đối với mỗi mục bạn truy cập, hãy kiểm tra id của mục đó. Nếu đó là một trận đấu, trả lại nó.
Nếu bạn chỉ muốn tz codez:
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
}
Và điều tương tự khi sử dụng các phương thức Array của ECMAScript 5:
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];
}
Bạn có thể làm điều này ngay cả trong JavaScript thuần bằng cách sử dụng hàm "bộ lọc" tích hợp cho các mảng:
Array.prototype.filterObjects = function(key, value) {
return this.filter(function(x) { return x[key] === value; })
}
Vì vậy, bây giờ chỉ cần chuyển "id" thay cho key
và "45" thay cho value
, và bạn sẽ có được đối tượng đầy đủ khớp với id là 45. Vì vậy, đó sẽ là,
myArr.filterObjects("id", "45");
Sử dụng Array.prototype.filter()
chức năng.
DEMO : 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
}
}
];
LỌC
var getPerson = function(name){
return jsonObj.filter(function(obj) {
return obj.name === name;
});
}
.filter
phương pháp trên obj.info
trong vòng lặp lồng nhau. var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
Chúng ta có thể sử dụng các phương thức Jquery $.each()/$.grep()
var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}
hoặc là
var data = $.grep(array, function( n, i ) {
return ( n !== 5 && i > 4 );
});
sử dụng cú pháp ES6:
Array.find, Array.filter, Array.forEach, Array.map
Hoặc sử dụng Lodash https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter
Tôi thực sự thích câu trả lời do Aaron Digulla cung cấp nhưng cần phải giữ mảng đồ vật của tôi để tôi có thể lặp lại qua nó sau. Vì vậy, tôi đã sửa đổi nó thành
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
Sử dụng:
var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {
if (obj.id === '5') { // id.toString() if it is int
retObj = obj;
return false;
}
});
return retObj;
Nó sẽ trả về một đối tượng bằng id.
Giải pháp này cũng có thể hữu ích:
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");
Tôi đã làm cho nó giống như $.grep
và nếu một đối tượng được tìm ra, hàm sẽ trả về đối tượng, thay vì một mảng.
function will return the object, rather than an array
có thể mắc lỗi, nhưng tôi nghĩ nó phụ thuộc vào người dùng.
Bắt đầu từ câu trả lời của aggaton , đây là một hàm thực sự trả về phần tử mong muốn (hoặc null
nếu không tìm thấy), được cung cấp array
và một callback
hàm trả về giá trị trung thực cho phần tử "chính xác":
function findElement(array, callback) {
var elem;
return array.some(function(e) {
if (callback(e)) {
elem = e;
return true;
}
}) ? elem : null;
});
Chỉ cần nhớ rằng điều này không thực sự hoạt động trên IE8-, vì nó không hỗ trợ some
. Một polyfill có thể được cung cấp, thay vào đó luôn có for
vòng lặp cổ điển :
function findElement(array, callback) {
for (var i = 0; i < array.length; i++)
if (callback(array[i])) return array[i];
return null;
});
Nó thực sự nhanh hơn và gọn hơn. Nhưng nếu bạn không muốn phát minh lại bánh xe, tôi khuyên bạn nên sử dụng một thư viện tiện ích như gạch dưới hoặc lodash.
Ngắn nhất
var theAnswerObj = _.findWhere(array, {id : 42});