Có, Array.map() hoặc $.map() cũng làm như vậy.
//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/
Kể từ array.map không được hỗ trợ trong các trình duyệt cũ, tôi đề nghị bạn nên gắn bó với phương pháp jQuery.
Nếu bạn thích một lý do khác vì một lý do nào đó bạn luôn có thể thêm một polyfill cho hỗ trợ trình duyệt cũ.
Bạn luôn có thể thêm các phương pháp tùy chỉnh để nguyên mẫu mảng cũng như:
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 các nhà xây dựng chức năng nếu bạn vượt qua một chuỗi. Một cái gì đó để chơi xung quanh với 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, tôi thêm tương tự như tôi where()
+ firstOrDefault()
. Đây cũng có thể được sử dụng với các chuỗi dựa phương pháp hàm xây dựng (đó là nhanh nhất), nhưng đây là một cách tiếp cận sử dụng một đối tượng theo nghĩa đen như 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;
};
Cách 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' });
Đây là một jsperf test để so sánh hàm tạo hàm so với tốc độ chữ của đối tượng. Nếu bạn quyết định sử dụng tên cũ, hãy nhớ trích dẫn chính xác các chuỗi.
sở thích cá nhân của tôi là sử dụng các đối tượng giải pháp dựa theo nghĩa đen khi lọc 1-2 thuộc tính, và vượt qua một chức năng gọi lại cho việc lọc phức tạp hơn.
tôi sẽ kết thúc chuyện này với 2 lời khuyên chung khi thêm phương pháp để nguyên mẫu đối tượng bẩm sinh:
Kiểm tra cho sự xuất hiện của các phương pháp hiện có trước khi ghi đè lên ví dụ:
if(!Array.prototype.where) { Array.prototype.where = ...
Nếu bạn không cần phải hỗ trợ IE8 trở xuống, xác định các phương thức sử dụng Object.defineProperty để làm cho chúng không thể đếm được. Nếu ai đó sử dụng for..in
trên một mảng (đó là sai ở nơi đầu tiên) họ sẽ lặp lại các thuộc tính đếm là tốt. Chỉ cần một đầu lên.
@ChrisNevill Tôi đã thêm phiên bản chuỗi cũng như trong trường hợp bạn bị xâm nhập – Johan
@MUlferts Bắt kịp, cập nhật :). Ngày nay tôi sẽ đề nghị sử dụng lodash cho những loại nhiệm vụ này. Chúng lộ diện tương tự như mã trên – Johan
Để hỗ trợ các quan sát loại trực tiếp: 'kiểu trả về của mục [thuộc tính] === 'chức năng'? item [property]() === filter [property]: item [property] === filter [property]; ' –