-
Notifications
You must be signed in to change notification settings - Fork 1
JavaScript Array
Trong những bài viết trước, tôi đã giới thiệu với các bạn về những kiểu dữ liệu cơ bản là: numbers, strings, boolean. Hôm nay, tôi sẽ nói về kiểu dữ liệu nâng cao hơn. Đó là array. JavaScript array giúp bạn có thể biểu diễn được những dữ liệu phức tạp và dễ dàng hơn trong việc quản lý cũng như xử lý dữ liệu.
Array, hay còn gọi là mảng, là kiểu dữ liệu mà giá trị của nó chứa nhiều giá trị khác. Mỗi giá trị trong một mảng được gọi là element (phần tử). Trước tiên, giả sử bạn có dãy 6 chữ số: 1, 2, 6, 7, 3, 4. Để lưu trữ sáu số này bạn có thể sử dụng 6 biến:
var num1 = 1; var num2 = 2; var num3 = 6; var num4 = 7; var num5 = 3; var num6 = 4;
Nhưng nếu không phải là 6 số mà là 100, 1000, 10000 số,... thì chắc chắn bạn sẽ không thể sử dụng cách này được. Thật may mắn, với việc sử dụng JavaScript array, bạn có thể biểu diễn sáu số này một cách gọn hơn:
var array1 = [1, 2, 6, 7, 3, 4];
Trong đó, array1 chứa các phần tử cùng kiểu là number.
Thông thường, trong nhiều ngôn ngữ lập trình như C/C++, Java, các phần tử trong một array sẽ có cùng kiểu dữ liệu. Tuy nhiên, JavaScript array có thể chứa các phần tử với kiểu dữ liệu khác nhau. Do đó, mảng sau là hợp lệ:
var array2 = [1, "hai", true, 4.5, -7, NaN, null, undefined];
Ở đây, array2 chứa các phần tử với các kiểu hoàn toàn khác nhau (number, string, boolean, NaN, null,...). Ngoài ra, trong một mảng cũng có thể chứa những mảng khác.
var array1 = [1, 2, [6, 4, 8], 7, [3, 5], 4];
Để truy cập một phần tử trong JavaScript array, bạn cần sử dụng cặp dấu ngoặc vuông [], và một số nguyên dương xác định chỉ số (số thứ tự) của phần tử trong mảng. Chú ý: chỉ số mảng luôn bắt đầu từ 0. Và nếu bạn truy cập vào chỉ số ngoài mảng hoặc chỉ số không phải số nguyên dương thì kết quả trả về sẽ là undefined.
var arr = [1, 3, 5, 0]; console.log(arr[0]); // => 1 console.log(arr[1]); // => 3 console.log(arr[4]); // => undefined console.log(arr[-1]); // => undefined console.log(arr[1.4]); // => undefined
Trong ví dụ này, mảng arr có 4 phần tử, mà chỉ số bắt đầu từ 0 nên các chỉ số hợp lệ là: 0, 1, 2, 3. Khi truy cập vào những chỉ số không hợp lệ như 4, -1, 1.4 thì kết quả đều là undefined.
Một thuộc tính quan trọng của array trong JavaScript là length. Thuộc tính này lưu trữ độ dài (số phần tử) của mảng.
var a = []; console.log(a.length); // => 0 var b = [1, 2, 3, 4, 5]; console.log(b.length); // => 5
Nếu sử dụng thuộc tính length, tôi có thể dễ dàng truy cập vào phần tử cuối mảng - có chỉ số là length - 1:
var a = ['cat', 'dog', 'fish', 'chicken']; console.log(a[a.length - 1]); // => chicken
JavaScript cung cấp sẵn nhiều phương thức có thể sử dụng với array. Sau đây là một số phương thức phổ biến:
Kiểm tra obj có phải là array hay không. Nếu đúng thì trả về true, ngược lại trả về false.
console.log(Array.isArray([1, 2, 3])); // => true console.log(Array.isArray(1, 2, 3)); // => false console.log(Array.isArray('hehe')); // => false console.log(Array.isArray({a:1, b:2}));// => false
Trả về một Array mới chứa các phần tử là e1, e2...
var a = Array.of(); console.log(a); // => [] var b = Array.of(1, 2, 3); console.log(b); // => [1, 2, 3] var c = Array.of(1, 'hai', null, NaN); console.log(c); // => [1, 'hai', null, NaN]
Thay thế tất cả các phần tử trong mảng với chỉ số >= start và < end bởi giá trị là value. Với start mặc định là 0 và end mặc định là độ dài length của array. Chú ý: start hoặc end có thể âm. Khi đó ta sẽ hiểu start tương ứng với chỉ số length + start và end tương ứng với chỉ số length + end.
var a = [2, 4, 5, 10]; a.fill(6); console.log(a); // => [6, 6, 6, 6] a.fill(3, 1); console.log(a); // => [6, 3, 3, 3] a.fill(2, 2, 4); console.log(a); // => [6, 3, 2, 2] a.fill(5, -4, -2); console.log(a); // => [5, 5, 2, 2]
Thêm vào cuối của array giá trị e1, e2,... và trả về độ dài mới của mảng.
var a = []; console.log(a); // => [] var len = a.push(10); console.log(len, a); // => 1 [10] len = a.push(2, 3); console.log(len, a); // => 3 [10, 2, 3]; len = a.push([4, 1], 'hihi'); console.log(len, a); // => 5 [10, 2, 3, [4, 1], 'hihi']
Bỏ đi phần tử cuối của mảng và trả về giá trị của phần tử đó. Nếu ban đầu mảng là rỗng thì kết quả trả về là undefined.
var a = ['one', 'two', 'three']; var t = a.pop(); console.log(t); // => three console.log(a); // => ['one', 'two'] var e = []; t = e.pop(); console.log(t); // => undefinded
Đảo ngược giá trị của mảng (phần tử cuối lên đầu và phần tử đầu tiên xuống cuối). Đồng thời trả về giá trị của mảng mới đã được reverse.
var b = [9, 10, 11, 12]; var r = b.reverse(); console.log(b); // => [12, 11, 10, 9] console.log(r); // => [12, 11, 10, 9]
Bỏ đi phần tử đầu tiên của mảng và trả về giá trị của phần tử đó.
var s = ['car', 'bike', 'train']; var e = s.shift(); console.log(e); // => car console.log(s); // => ['bike', 'train']
Thêm một hay nhiều phần tử vào đầu tiên của mảng và độ dài mới của mảng.
var m = [1, 3, 5, 7]; var len = m.unshift(9, 8, NaN); console.log(m); // => [9, 8, NaN, 1, 3, 5, 7] console.log(len); // => 7
Bỏ đi số lượng phần tử là deleteCount tại vị trí start và sau đó thêm vào đó các phần tử e1, e2. Kết quả trả về là mảng các phần tử bị bỏ đi. start: nếu start >= 0 thì start là chỉ số tại phần tử bắt đầu thay đổi, ngược lại start < 0 thì start là số lượng phần tử tính từ cuối mảng. deleteCount: Là số nguyên xác định số lượng phần tử bị xoá. Nếu deleteCount = 0 thì không phần tử nào bị xoá. Nếu bạn không sử dụng deleteCount thì mặc định deleteCount = (array.length - start), đồng nghĩa với các phần tử từ start đến cuối array sẽ bị xoá. e1, e2,...: Thêm vào vị trí start các phần tử e1, e2,...
var a = [10, 11, 12, 13]; var b = a.splice(2, 0); console.log(a); // => [10, 11, 12, 13] console.log(b); // => [] var c = a.splice(2, 1); console.log(a); // => [10, 11, 13] console.log(c); // => [12] var d = a.splice(2, 1, 15, 16, 17); console.log(a); // => [10, 11, 15, 16, 17] console.log(d); // => [13] var e = a.splice(-2, 1); console.log(a); // => [10, 11, 15, 17] console.log(e); // => [16] var f = a.splice(2); console.log(a); // => [10, 11] console.log(f); // => [15, 17]
Trả về mảng mới bằng cách lấy mảng hiện tại nối với các phần tử value1, value2,...
var c = ['a', 'b', 'c']; var d = [1, 2, 3]; var e = c.concat(d); console.log(c); // => ['a', 'b', 'c'] console.log(e); // => ['a', 'b', 'c', 1, 2, 3] var f = c.concat(1, 2); console.log(f); // => ['a', 'b', 'c', 1, 2] var g = c.concat(['hello', 'hi'], 1); console.log(g); // => ['a', 'b', 'c', 'hello', 'hi', 1]
Kiểm tra xem trong mảng hiện tại tính từ fromIndex có chứa phần tử searchElement không. Nếu tồn tại thì trả về true, ngược lại thì trả về false. fromIndex: Nếu không khai báo thì mặc định là 0. Nếu fromIndex < 0 thì vị trí bắt đầu tìm kiếm là array.length + fromIndex.
var a = [0, 2, 4, 6, 8]; console.log(a.includes(1)); // => false console.log(a.includes(2)); // => true console.log(a.includes(4, 1)); // => true console.log(a.includes(4, 3)); // => false console.log(a.includes(6,-2)); // => true console.log(a.includes(2,-2)); // => false
Trả về vị trí phần tử đầu tiên trong mảng có giá trị searchElement, tính từ vị trí fromIndex. Nếu không tìm thấy thì trả về -1. fromIndex: Nếu không khai báo thì mặc định là 0. Nếu fromIndex > array.length thì kết quả trả về là -1. Nếu fromIndex < 0 thì vị trí bắt đầu tìm kiếm là array.length + fromIndex. Nếu vị trí bắt đầu tìm kiếm < 0 thì toàn bộ array sẽ được tìm kiếm.
var a = [0, 2, 3, 4]; console.log(a.indexOf(2)); // => 1 console.log(a.indexOf(2, 2)); // => -1 console.log(a.indexOf(3,-2)); // => 2 console.log(a.indexOf(4, 10));// => -1
Tương tự như array.indexOf, nhưng kết quả trả về sẽ là phần tử đầu tiên tìm được tính từ vị trí fromIndex trở về đầu (tìm kiếm ngược lại so với array.indexOf).
var x = [1, 2, 3, 4, 3, 2, 1]; console.log(x.lastIndexOf(2)); // => 5 console.log(x.lastIndexOf(3, 3));// => 2 console.log(x.lastIndexOf(3, 5));// => 2
Convert tất cả các phần tử trong mảng thành string và ghép chúng thành một string mới. Nếu một phần tử là null hoặc undefined thì nó sẽ được convert thành string rỗng.
var a = [1, 2, [3, 4], 'hello', null, NaN, undefined]; var b = a.toString(); console.log(b); // => 1,2,3,4,hello,,NaN,
Tương tự như array.toString(), tuy nhiên bạn có thể tuỳ biến thành phần phân cách. Lúc này các phần tử sẽ phân cách nhau bởi seperator. Nếu không được khai báo thì mặc định seperator là dấu phẩy ",".
var a = [1, 2, [3, 4], 'hello', null, NaN, undefined]; var b = a.join(); console.log(b); // => 1,2,3,4,hello,,NaN, var c = a.join('-'); console.log(c); // => 1-2-3,4-hello--NaN-
Cho một mảng các số. Hãy sắp xếp các số trong mảng theo thứ tự tăng dần bằng cách triển khai hàm sắp xếp theo những thuật toán sau:
- Sắp xếp chọn trực tiếp - selection sort (tham khảo)
- Sắp xếp chèn trực tiếp - insertion sort (tham khảo)
- Sắp xếp chèn trực tiếp dựa vào tìm kiếm nhị phân - binary insertion sort (tham khảo)
- Sắp xếp đổi chỗ trực tiếp - interchange sort (tham khảo)
- Sắp xếp nổi bọt - bubble sort (tham khảo)
- Thuật toán shaker sort (tham khảo)
- Sắp xếp nhanh - quick sort (tham khảo)
- Sắp xếp trộn - merge sort (tham khảo)
- Sắp xếp vun đống - heap sort (tham khảo)
Nếu bạn thấy khó khăn thì có thể xem cách tôi triển khai các thuật toán sắp xếp bằng C/C++ tại đây và đây.
Trên đây là một số những phương thức cơ bản về JavaScript array. Còn nhiều những phương thức khác, nhưng tôi sẽ không trình bày ở bài viết này. Bạn có thể tham khảo thêm tại các link cuối bài viết. Xin chào và hẹn gặp lại ở bài viết sau trong series JavaScript cơ bản. Thân ái,
- https://www.javascript.com/learn/javascript/arrays
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
Bản gốc: Blog Complete JavaScript
Bài viết cùng chuyên mục:
- Giới thiệu tổng quan về ngôn ngữ lập trình JavaScript
- Values, types và operators trong JavaScript – Phần 1
- Values, types và operators trong JavaScript – Phần 2
- Cấu trúc chương trình trong JavaScript
- Tìm hiểu function JavaScript
- Tìm hiểu JavaScript Closures
- Array Sorting – vấn đề muôn thuở
- JavaScript Object – last but not least
- JavaScript forEach là cái quái gì?
- Phân biệt call, apply và bind trong JavaScript
- Tìm hiểu về JSON trong JavaScript
- Lập trình hướng đối tượng với JavaScript?
- Các khía cạnh lập trình hướng đối tượng trong JavaScript
- Debug JavaScript – dễ hay khó?
- Một số lỗi khi sử dụng Strict mode JavaScript
- Tìm hiểu Regular Expression JavaScript
- Cơ bản về DOM JavaScript
- Xử lý một số Event JavaScript cơ bản
- XMLHttpRequest – Tạo HTTP request đến server trong JavaScript