2016-07-19 21 views
7

(http://eloquentjavascript.net/07_elife.html)Thiết lập lưới. Hùng hồn js chương 7

Im có một thời gian khó hiểu những gì các phương pháp lưới chúng tôi đã thêm .get và .set thậm chí do.Firstly, cho phép đi qua một trường hợp ví dụ. var grid = new Grid(5,5); không gian bây giờ là một mảng của các yếu tố 25. Và tất nhiên là widthheightare 5.

Bây giờ câu hỏi là phương pháp "làm".

Bây giờ chúng tôi đã nói console.log(grid.get(new Vector(1, 1)));.

Vì vậy x trở thành 1, y trở thành 1 trong đối tượng mới, chúng tôi tạo ra. Tất nhiên chúng ta cần phải thực hiện grid.get, do đó chúng tôi trả về this.space[1+ 1 * 5], tức là vị trí thứ 6 trong mảng không gian có độ dài là 25. Vậy tại sao bản in này không xác định? Có phải vì không có gì trong mảng không gian?

TLDR

như thế nào .get.set nguyên mẫu làm việc tại đây (họ làm gì)? Ngoài ra, tại sao chúng tôi đặt return this.space[vector.x + this.width*vector.y];, có một số ý nghĩa số đối với vector.x+this.width*vector.y không?

function Vector(x,y){ 
     this.x = x; 
     this.y = y; 
    } 

    Vector.prototype.plus = function(other){ 

     return new Vector(this.x + other.x, this.y + other.y); 
    } 


    var grid = ["top left", "top middle", "top right", 
     "bottom left", "bottom middle", "bottom right"]; 


    function Grid (width,height){ 

     this.space = new Array(width * height); 
     this.width = width; 
     this.height = height; 

    } 

    Grid.prototype.isInside = function(vector){ 


     return vector.x >=0 && vector.x<this.width && vector.y>=0 && vector.y<this.height; 

    } 

    Grid.prototype.get = function(vector){ 

     return this.space[vector.x + this.width*vector.y]; 
     // 5 + 5 * 1; 

    } 

    Grid.prototype.set = function(vector,value){ 

     this.space[vector.x + this.width *vector.y] = value; 

    } 

    var grid = new Grid(5, 5); 

    console.log(grid.get(new Vector(1, 1))); 
    // → undefined 
    grid.set(new Vector(1, 1), "X"); 
    console.log(grid.get(new Vector(1, 1))); 
    // → X 

Trả lời

6

Tôi không biết liệu tôi có thể rõ ràng hơn bài viết bạn đang theo dõi hay không, nhưng tôi sẽ thử.

này: new Array(25) tương đương với điều này: [undefined, undefined, undefined, ...25x]

Trong code của bạn, bạn có điều này:

var grid = ["top left", "top middle", "top right", "bottom left", "bottom middle", "bottom right"];

sau đó tuyên bố var cùng một lần nữa:

var grid = new Grid(5, 5);

Vì vậy, cuối cùng, grid là equa l đến [undefined, undefined, undefined, ...]. Đó là lý do tại sao bạn nhận được không xác định trước khi thiết lập bất cứ điều gì.


getset, chỉ cần tìm ra vị trí của một mục trong mảng, và đọc, hoặc viết giá trị ở vị trí nói. Đây là mã tìm vị trí trong mảng: vector.x+this.width*vector.y.Hãy phá vỡ nó xuống:

vector.x = bảng cột

vector.y = bảng hàng

Hãy tưởng tượng một 3x2 bảng = [ 'row0 col0', 'row0 col1', 'row0 col2', 'ROW1 col0' , 'row1 col1', 'row1 col2']

bây giờ chúng tôi muốn mục tại cột 2, hàng 1, vì vậy new Vector(2, 1). Đó là mục ở vị trí 5 trong mảng của chúng tôi. Vì vậy, bắt đầu từ hàng 1 (this.width * vector.y) = (3 * 1), nhận mục tại cột 2 (+ vector.x) = (+ 2)

this.width là kích thước của mỗi hàng, vì vậy khi bạn nhân với vector.y, nó có nghĩa là vector.y tương đương với một số hàng nhất định. Sau đó, từ đó, bạn chỉ cần tổng hợp vị trí cột (vector.x).


dữ liệu bảng Đại diện

Một bảng có nhiều dòng, và mỗi hàng có một số cột, vì vậy bạn có thể đại diện cho một bảng sử dụng một mảng cho mỗi hàng, như:

row1 = ['item1', 'item2']; 
row2 = ['item3', 'item4']; 

table = [row1, row2]; 

Điều đó sẽ cung cấp cho bạn một mảng đa chiều: [ ['item1', 'item2'], ['item3', 'item4'] ]

Có nghĩa là bạn sẽ truy cập dữ liệu như: table[ rowIndex ][ columnIndex ]

Nhưng phương pháp mà bạn đang sử dụng, lưu trữ tất cả các mục trong một danh sách duy nhất, một mảng duy nhất: table = ['item1', 'item2', 'item3', 'item4']

Bây giờ giả sử chúng ta muốn tìm mục tương tự như trong ví dụ trước, sử dụng rowIndexcolumnIndex , ngoại trừ thời gian này chỉ có một danh sách các mục duy nhất, vì vậy chúng tôi cần kết hợp rowIndexcolumnIndex thành một số duy nhất để lấy mục bằng cách sử dụng: table[ indexOfItemIWant ]. làm sao chúng ta làm việc đó bây giờ? Bạn biết rằng tất cả các hàng được liệt kê sau hàng khác và tất cả các hàng có cùng số mục trên đó. Vì vậy, để tìm đầu của một hàng trong danh sách của chúng tôi, chúng tôi nhân kích thước của các hàng, theo số lượng hàng chúng tôi muốn bỏ qua. Trong một bảng trong đó mỗi hàng có hai mục, giống như trong ví dụ của chúng ta, hàng đầu tiên bắt đầu tại vị trí 0 và chiếm hai vị trí, do đó hàng tiếp theo, bắt đầu ở vị trí 0 + 2, tiếp theo, ở vị trí 0 +2 + 2, sau đó 0 +2 +2 +2 và cứ tiếp tục như vậy, đó là lý do tại sao bạn sử dụng width (số lượng mục trong một hàng) lần hàng tôi muốn nhận (vector.y).

+0

Hmm ... Tôi nghĩ rằng tôi hiểu nhưng tôi có thể cần phải suy nghĩ về nó hơn –

+0

Vì vậy, những gì hiện vector.x + this.width * vector.y thực sự đại diện? Đó có phải là nơi chúng ta sắp đặt thứ gì đó không? –

+0

Tôi sẽ sớm thêm một vài chi tiết về cách hoạt động của toàn bộ vectơ ... –

2

Một space là một mảng, và một vector được sử dụng để chuyển đổi từ 2 chiều (x, y) đến một chỉ số i vào space, do đó .set sẽ đặt một giá trị x để chỉ số i, và .get được sử dụng để nhận/đọc bất kỳ giá trị nào được đặt bởi .set.

Và đối với một vị trí bên trong không gian, hãy nói space[j] là không xác định nếu trước đây không phải là set.

+0

Vì vậy, những gì chính xác là signifance của vector.x + this.width * vector.y? –

+0

Biến đổi Vector (x, y) thành chỉ mục trong không gian, ví dụ Vector (1, 1) là hàng thứ hai và thứ hai trong giây, và nó được dịch thành chỉ mục 6 bên trong không gian. Đang cố gắng để hình ảnh rằng làm thế nào bạn sẽ làm điều đó bằng tay hoặc giấy để dịch (x, y) vị trí thành một mảng 1 chiều. –

0

Chỉ cần thêm vào lời giải thích rất tốt của Hugo Silva ở trên. Tôi đã cố gắng để hiểu cùng một mã, trong khi làm Chapter-7. Số học chung đằng sau chuyển đổi một mảng 2D thành 1D là

2d [i] [j] = 1d [j + i * Total_number_of_columns_in_the_matrix]

Nói cách khác ..

2d [chiều cao] [chiều rộng ] = 1d [chiều rộng + chiều cao * Tổng số_of_columns_in_the_Matrix]

Với 'i' đại diện cho số hàng (tức là chiều cao hoặc khoảng cách từ đầu Ma trận) và 'j' số cột (tức là chiều rộng hoặc khoảng cách từ bên trái của Ma trận). Và đó, tôi bắt đầu đánh số từ i, j = (0,0) đại diện cho một vị trí tại hàng 0 và cột 0, cho một yêu cầu row-major (tức là các phần tử liên tiếp của các hàng của mảng nằm liền kề trong bộ nhớ và tất cả các hàng được liệt kê cái này sau cái khác).

Vì vậy, [0] [1] là mục thứ hai ở hàng trên cùng, [1] [n] nằm ở hàng thứ hai, v.v.

Các phần tử mảng ở đây trong một hàng duy nhất nằm trong nhóm 3 ("trên cùng bên trái", "trên cùng giữa", "trên cùng bên phải"). Vì vậy, tôi cần tìm chỉ mục hoặc số lượng nhóm mà tôi muốn bắt đầu. Đó là phần của công thức i * Tổng số_number_of_columns_in_the_matrix. Khi tôi tìm thấy nhóm tôi muốn bắt đầu, sau đó tôi thêm j để lấy số lượng ô mà tôi muốn.

Trong khi đếm chỉ mục cho hàng đầu tiên (đại diện cho i = 0), tôi không có bất kỳ số phần tử trước nào để thêm. Vì vậy, chỉ số Mảng cho hàng đầu tiên sẽ chỉ là 0,1,2.

Sau đó, khi tôi đến hàng thứ hai (i = 1), bây giờ, bởi vì, tôi đã có 3 mục từ hàng đầu tiên, vì vậy tôi cần phải bắt đầu với chỉ số 1 * 3 + 0,1,2 và Sớm.

Một cách nhanh chóng blog post Tôi đã viết về điều này, chỉ để ghi lại sự hiểu biết của chính tôi.

Các vấn đề liên quan