2010-03-14 25 views
13

Khi tiếp tục min/max của tôi trên một mảng các đối tượng, tôi đã tự hỏi về các so sánh hiệu suất của bộ lọc so với bản đồ.Bộ lọc Javascript vs vấn đề bản đồ

Vì vậy, tôi đặt cùng một thử nghiệm trên các giá trị trong mã của tôi như là sẽ xem xét các kết quả trong FireBug.

Đây là mã:

var _vec = this.vec; 
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; })); 
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; })); 

Phiên bản map PED trả về kết quả chính xác. Tuy nhiên phiên bản ed filter trả về NaN. Phá vỡ nó ra, bước qua và cuối cùng kiểm tra kết quả, nó sẽ xuất hiện rằng hàm bên trong trả về thuộc tính x của _vec nhưng mảng thực được trả về từ filter là chưa được lọc _vec.

Tôi tin rằng việc sử dụng filter là chính xác - bất kỳ ai khác có thể thấy sự cố của tôi không?

Dưới đây là một thử nghiệm đơn giản:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>S:GTC Map Test</title> 
</head> 
<body> 
<script type="text/javascript"> 
function vector(x,y,z) { this.x = x; this.y =y; this.z=z; } 
var vec = []; 
vec.push(new vector(1,1,1)); 
vec.push(new vector(2,2,2)); 
vec.push(new vector(2,3,3)); 
var _vec = vec; 
min_x = Math.min.apply(Math, _vec.filter(function(el){ return el["x"]; })); 
min_y = Math.min.apply(Math, _vec.map(function(el){ return el["x"]; })); 

document.write("<br>filter = " + min_x); 
document.write("<br>map = " + min_y); 
</script> 
</body> 
</html> 

Trả lời

34

Không, phương pháp filter không trả lại mảng unfiletered. Nó trả về một mảng chứa các mục mà hàm bên trong trả về true.

Khi bạn không trả về giá trị boolean từ hàm bên trong, giá trị được chuyển thành boolean, do đó tham chiếu đối tượng được chuyển thành true. Do đó, nó trả về một mảng mới chứa tất cả các mục từ mảng ban đầu.

Phương thức filter không giống như phương pháp map. Phương pháp map được sử dụng để chuyển đổi từng mục của một mảng, trong khi phương thức filter được sử dụng để chọn các mục nhất định của một mảng. So sánh hiệu suất giữa các phương thức là tranh luận, vì chỉ một trong số chúng thực hiện những gì bạn muốn làm.

+2

Ahh. Có vẻ như tôi đã hiểu lầm cách functon lọc hoạt động. Tôi đã ấn tượng rằng nó đã trả về một đối tượng đã được sửa đổi thành một mảng. –

4

Trích dẫn từ:

JavaScript: The Definitive Guide
David Flanagan

bản đồ()

Phương pháp map() qua mỗi phần tử của mảng mà nó là được gọi đến hàm bạn chỉ định và trả về một mảng chứa các giá trị được trả về bởi hàm đó.

Ví dụ:

a = [1, 2, 3]; 

b = a.map(function(x) { return x*x; }); // b is [1, 4, 9] 

Chức năng bạn vượt qua để lập bản đồ() được gọi theo cách tương tự như hàm truyền cho foreach(). Tuy nhiên, đối với phương thức map(), hàm mà bạn vượt qua sẽ trả về một giá trị. Lưu ý rằng map() trả về một mảng mới: nó không sửa đổi mảng mà nó được gọi vào. Nếu mảng đó là thưa thớt, mảng được trả về sẽ bị thưa thớt theo cùng một cách: nó sẽ có cùng độ dài và cùng một phần tử bị thiếu.

lọc()

Phương pháp này trả về một mảng chứa một tập hợp con của các phần tử của mảng mà trên đó nó được gọi. Hàm bạn chuyển đến nó phải là thuộc tính : hàm trả về đúng hoặc sai. Vị từ là được gọi như forEach() và map(). Nếu giá trị trả về là đúng, hoặc giá trị chuyển đổi thành true, thì phần tử được chuyển đến thuộc tính là thành viên của tập hợp con và được thêm vào mảng sẽ trở thành giá trị trả về.

Ví dụ:

a = [5, 4, 3, 2, 1]; 

smallvalues = a.filter(function(x) { return x < 3 }); // [2, 1] 

everyother = a.filter(function(x,i) { return i%2==0 }); // [5, 3, 1] 
Các vấn đề liên quan