Có, Array.map () hoặc $ .map () thực hiện điều tương tự.
//array.map:
var ids = this.fruits.map(function(v){
return v.Id;
});
//jQuery.map:
var ids2 = $.map(this.fruits, function (v){
return v.Id;
});
console.log(ids, ids2);
http://jsfiddle.net/NsCXJ/1/
Vì Array.map không được hỗ trợ trong các trình duyệt cũ hơn, tôi khuyên bạn nên sử dụng phương thức jQuery.
Nếu bạn thích cái khác vì một số lý do, bạn luôn có thể thêm một polyfill để hỗ trợ trình duyệt cũ.
Bạn luôn có thể thêm các phương thức tùy chỉnh vào nguyên mẫu mảng:
Array.prototype.select = function(expr){
var arr = this;
//do custom stuff
return arr.map(expr); //or $.map(expr);
};
var ids = this.fruits.select(function(v){
return v.Id;
});
Một phiên bản mở rộng sử dụng hàm tạo nếu bạn truyền chuỗi. Một cái gì đó để chơi xung quanh có lẽ:
Array.prototype.select = function(expr){
var arr = this;
switch(typeof expr){
case 'function':
return $.map(arr, expr);
break;
case 'string':
try{
var func = new Function(expr.split('.')[0],
'return ' + expr + ';');
return $.map(arr, func);
}catch(e){
return null;
}
break;
default:
throw new ReferenceError('expr not defined or not supported');
break;
}
};
console.log(fruits.select('x.Id'));
http://jsfiddle.net/aL85j/
Cập nhật:
Vì đây đã trở thành một câu trả lời phổ biến như vậy, nên tôi thêm tương tự where()
+ firstOrDefault()
. Chúng cũng có thể được sử dụng với cách tiếp cận hàm xây dựng hàm dựa trên chuỗi (nhanh nhất), nhưng đây là một cách tiếp cận khác sử dụng một đối tượng theo nghĩa đen là bộ lọc:
Array.prototype.where = function (filter) {
var collection = this;
switch(typeof filter) {
case 'function':
return $.grep(collection, filter);
case 'object':
for(var property in filter) {
if(!filter.hasOwnProperty(property))
continue; // ignore inherited properties
collection = $.grep(collection, function (item) {
return item[property] === filter[property];
});
}
return collection.slice(0); // copy the array
// (in case of empty object filter)
default:
throw new TypeError('func must be either a' +
'function or an object of properties and values to filter by');
}
};
Array.prototype.firstOrDefault = function(func){
return this.where(func)[0] || null;
};
Sử dụng:
var persons = [{ name: 'foo', age: 1 }, { name: 'bar', age: 2 }];
// returns an array with one element:
var result1 = persons.where({ age: 1, name: 'foo' });
// returns the first matching item in the array, or null if no match
var result2 = persons.firstOrDefault({ age: 1, name: 'foo' });
Dưới đây là một bài kiểm tra jsperf để so sánh hàm tạo hàm với tốc độ theo nghĩa đen của đối tượng. Nếu bạn quyết định sử dụng trước đây, hãy ghi nhớ để trích dẫn chuỗi chính xác.
Sở thích cá nhân của tôi là sử dụng các giải pháp dựa trên đối tượng khi lọc 1-2 thuộc tính và chuyển một hàm gọi lại để lọc phức tạp hơn.
Tôi sẽ kết thúc điều này bằng 2 mẹo chung khi thêm phương thức vào các nguyên mẫu đối tượng gốc:
Kiểm tra sự xuất hiện của các phương thức hiện có trước khi ghi đè, ví dụ:
if(!Array.prototype.where) {
Array.prototype.where = ...
Nếu bạn không cần hỗ trợ IE8 trở xuống, hãy xác định các phương thức bằng Object.defineProperty để làm cho chúng không thể đếm được. Nếu ai đó được sử dụng for..in
trên một mảng (sai ở vị trí đầu tiên), họ cũng sẽ lặp lại các thuộc tính vô số. Chỉ cần một cái đầu lên.