Collections
Map
Map của Node.js (set/get/has/delete, for...of) so với map[K]V của Go, HashMap của Rust, Dictionary của Swift và HashMap của Java.
- Phiên bản tối thiểu
- Node.js ≥ 12.20Go ≥ 1.23Rust ≥ 1.58Swift ≥ 3.0Java ≥ 25
- Đã chạy thử trên
- Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1
Code Node.js là ES module: lưu file .mjs hoặc đặt "type": "module" trong package.json.
Map trong Node.js là một class riêng với method set/get/has/delete. Go có map[K]V ngay trong cú pháp ngôn ngữ, không cần class hay method — truy cập bằng [], kiểm tra tồn tại bằng giá trị trả về thứ hai ("comma ok"). Rust có HashMap<K, V> trong thư viện chuẩn, Swift có Dictionary với cú pháp [K: V], Java có HashMap — cả ba đều không giữ thứ tự chèn khi duyệt, giống Go.
set, get, has, delete
const map = new Map()
map.set('foo', 'bar')
let found = map.has('foo')
console.log(found) // true
let item = map.get('foo')
console.log(item) // bar
map.delete('foo')
found = map.has('foo')
console.log(found) // false
item = map.get('foo')
console.log(item) // undefinedpackage main
import "fmt"
func main() {
map1 := make(map[string]string)
map1["foo"] = "bar"
item, found := map1["foo"] // "comma ok": found báo có tồn tại key hay không
fmt.Println(found) // true
fmt.Println(item) // bar
delete(map1, "foo")
item, found = map1["foo"]
fmt.Println(found) // false
fmt.Println(item) // "" (zero value của string, không phải nil)
}use std::collections::HashMap;
fn main() {
let mut map1: HashMap<String, String> = HashMap::new();
map1.insert("foo".to_string(), "bar".to_string());
let found = map1.contains_key("foo");
println!("{found}"); // true
let item = map1.get("foo");
println!("{item:?}"); // Some("bar")
map1.remove("foo");
let found = map1.contains_key("foo");
println!("{found}"); // false
let item = map1.get("foo");
println!("{item:?}"); // None
}var map1 = [String: String]()
map1["foo"] = "bar"
var found = map1["foo"] != nil
print(found) // true
var item = map1["foo"]
print(item as Any) // Optional("bar")
map1.removeValue(forKey: "foo") // cách ngắn hơn, cũng idiomatic: map1["foo"] = nil
found = map1["foo"] != nil
print(found) // false
item = map1["foo"]
print(item as Any) // nilvoid main() {
Map<String, String> map1 = new HashMap<>();
map1.put("foo", "bar");
boolean found = map1.containsKey("foo");
IO.println(found); // true
String item = map1.get("foo");
IO.println(item); // bar
map1.remove("foo");
found = map1.containsKey("foo");
IO.println(found); // false
item = map1.get("foo");
IO.println(item); // null
}Duyệt qua map
const map3 = new Map()
map3.set('foo', 100)
map3.set('bar', 200)
map3.set('baz', 300)
for (const [key, value] of map3) {
console.log(key, value)
}
// foo 100
// bar 200
// baz 300 (Map giữ đúng thứ tự chèn)import (
"maps"
"slices"
)
map2 := make(map[string]int)
map2["foo"] = 100
map2["bar"] = 200
map2["baz"] = 300
// thứ tự duyệt map ở Go bị random hoá, nên sort lại key để có kết quả ổn định
for _, key := range slices.Sorted(maps.Keys(map2)) {
fmt.Println(key, map2[key])
}
// bar 200
// baz 300
// foo 100let mut map2 = HashMap::new();
map2.insert("foo", 100);
map2.insert("bar", 200);
map2.insert("baz", 300);
// thứ tự duyệt HashMap của Rust không được đảm bảo, nên sort lại key
let mut keys: Vec<_> = map2.keys().collect();
keys.sort();
for key in keys {
println!("{key} {}", map2[key]);
}
// bar 200
// baz 300
// foo 100var map3 = [String: Int]()
map3["foo"] = 100
map3["bar"] = 200
map3["baz"] = 300
// thứ tự duyệt Dictionary không được đảm bảo, nên sort lại key
for key in map3.keys.sorted() {
print(key, map3[key]!)
}
// bar 200
// baz 300
// foo 100Map<String, Integer> map2 = new HashMap<>();
map2.put("foo", 100);
map2.put("bar", 200);
map2.put("baz", 300);
// thứ tự duyệt HashMap không được đảm bảo, nên sort lại key
for (String key : new TreeSet<>(map2.keySet())) {
IO.println(key + " " + map2.get(key));
}
// bar 200
// baz 300
// foo 100Khác biệt chính
Node.js Map |
Go map[K]V |
Rust HashMap |
Swift Dictionary |
Java HashMap |
|
|---|---|---|---|---|---|
| Kiểm tra tồn tại | .has(key) |
value, ok := m[key] |
.contains_key(key) |
dict[key] != nil |
.containsKey(key) |
| Giá trị khi thiếu key | undefined |
zero value của kiểu ("", 0, …) |
None (kiểu Option<&V>) |
nil (kiểu V?) |
null |
| Thứ tự duyệt | giữ thứ tự chèn | ngẫu nhiên | không đảm bảo | không đảm bảo | không đảm bảo |
| Xoá key | .delete(key) |
delete(m, key) |
.remove(key) |
.removeValue(forKey:) |
.remove(key) |
Tham khảo: github.com/miguelmota/golang-for-nodejs-developers#maps