tôi cần tạo một từ điển bằng javascript như thế này
tôi không nhớ ký hiệu chính xác, nhưng nó giống như:
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
có một thứ như vậy trong javascript không?
tôi cần tạo một từ điển bằng javascript như thế này
tôi không nhớ ký hiệu chính xác, nhưng nó giống như:
states_dictionary={ CT=[alex,harry], AK=[liza,alex], TX=[fred, harry] ........ }
có một thứ như vậy trong javascript không?
Câu trả lời:
Đây là một bài viết cũ, nhưng tôi nghĩ dù sao thì tôi cũng nên cung cấp một câu trả lời minh họa.
Sử dụng ký hiệu đối tượng của javascript. Như vậy:
states_dictionary={
"CT":["alex","harry"],
"AK":["liza","alex"],
"TX":["fred", "harry"]
};
Và để truy cập các giá trị:
states_dictionary.AK[0] //which is liza
hoặc bạn có thể sử dụng ký hiệu đối tượng theo nghĩa đen của javascript, theo đó các khóa không yêu cầu nằm trong dấu ngoặc kép:
states_dictionary={
CT:["alex","harry"],
AK:["liza","alex"],
TX:["fred", "harry"]
};
Object.hasOwnProperty.call(dictionary, key)(nếu không, người dùng có thể nhập giá trị valueOf và dictionary['valueOf']trả về Object.valueOf()hàm thuộc về nguyên mẫu Đối tượng mà có thể không phải là những gì mã của bạn mong đợi - lỗi tiềm ẩn hoặc vấn đề bảo mật ). Nếu khóa không phải là một loại chuỗi, thì cần phải cẩn thận, nếu không các chuyển đổi kiểu số và chuỗi ẩn sẽ gây ra sự cố cho bạn. MapLoại ES6 đã được thiết kế để cung cấp chức năng mở rộng cho từ điển.
Không có mảng liên kết thực nào trong Javascript cho đến năm 2015 (bản phát hành ECMAScript 6). Từ đó bạn có thể sử dụng đối tượng Bản đồ như các trạng thái của Robocat. Tra cứu thông tin chi tiết trong MDN . Thí dụ:
let map = new Map();
map.set('key', {'value1', 'value2'});
let values = map.get('key');
Nếu không có hỗ trợ cho ES6, bạn có thể thử sử dụng các đối tượng:
var x = new Object();
x["Key"] = "Value";
Tuy nhiên với các đối tượng, không thể sử dụng các thuộc tính hoặc phương thức mảng điển hình như array.length. Ít nhất có thể truy cập "mảng đối tượng" trong vòng lặp for.
Tôi nhận ra đây là một câu hỏi cũ, nhưng nó sẽ xuất hiện trên Google khi bạn tìm kiếm 'từ điển javascript', vì vậy tôi muốn thêm vào các câu trả lời ở trên rằng trong ECMAScript 6, Mapđối tượng chính thức đã được giới thiệu, đó là một từ điển thực hiện:
var dict = new Map();
dict.set("foo", "bar");
//returns "bar"
dict.get("foo");
Không giống như các đối tượng thông thường của javascript, nó cho phép bất kỳ đối tượng nào làm khóa:
var foo = {};
var bar = {};
var dict = new Map();
dict.set(foo, "Foo");
dict.set(bar, "Bar");
//returns "Bar"
dict.get(bar);
//returns "Foo"
dict.get(foo);
//returns undefined, as {} !== foo and {} !== bar
dict.get({});
dict = { key: value)?
Đã tạo một từ điển đơn giản trong JS tại đây:
function JSdict() {
this.Keys = [];
this.Values = [];
}
// Check if dictionary extensions aren't implemented yet.
// Returns value of a key
if (!JSdict.prototype.getVal) {
JSdict.prototype.getVal = function (key) {
if (key == null) {
return "Key cannot be null";
}
for (var i = 0; i < this.Keys.length; i++) {
if (this.Keys[i] == key) {
return this.Values[i];
}
}
return "Key not found!";
}
}
// Check if dictionary extensions aren't implemented yet.
// Updates value of a key
if (!JSdict.prototype.update) {
JSdict.prototype.update = function (key, val) {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
// Verify dict integrity before each operation
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Values[i] = val;
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Adds a unique key value pair
if (!JSdict.prototype.add) {
JSdict.prototype.add = function (key, val) {
// Allow only strings or numbers as keys
if (typeof (key) == "number" || typeof (key) == "string") {
if (key == null || val == null) {
return "Key or Value cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
return "Duplicate keys not allowed!";
}
}
this.Keys.push(key);
this.Values.push(val);
}
else {
return "Only number or string can be key!";
}
}
}
// Check if dictionary extensions aren't implemented yet.
// Removes a key value pair
if (!JSdict.prototype.remove) {
JSdict.prototype.remove = function (key) {
if (key == null) {
return "Key cannot be null";
}
if (keysLength != valsLength) {
return "Dictionary inconsistent. Keys length don't match values!";
}
var keysLength = this.Keys.length;
var valsLength = this.Values.length;
var flag = false;
for (var i = 0; i < keysLength; i++) {
if (this.Keys[i] == key) {
this.Keys.shift(key);
this.Values.shift(this.Values[i]);
flag = true;
break;
}
}
if (!flag) {
return "Key does not exist";
}
}
}
var dict = new JSdict();
dict.add(1, "one")
dict.add(1, "one more")
"Duplicate keys not allowed!"
dict.getVal(1)
"one"
dict.update(1, "onne")
dict.getVal(1)
"onne"
dict.remove(1)
dict.getVal(1)
"Key not found!"
Đây chỉ là một mô phỏng cơ bản. Nó có thể được tối ưu hóa hơn nữa bằng cách triển khai thuật toán thời gian chạy tốt hơn để làm việc với độ phức tạp thời gian ít nhất là O (nlogn) hoặc thậm chí ít hơn. Giống như hợp nhất / sắp xếp nhanh trên các mảng và sau đó là một số tìm kiếm B để tìm kiếm. Tôi đã không thử hoặc tìm kiếm về ánh xạ một hàm băm trong JS.
Ngoài ra, Khóa và Giá trị cho đối tượng JSdict có thể được chuyển thành các biến riêng tư để lén lút.
Hi vọng điêu nay co ich!
CHỈNH SỬA >> Sau khi thực hiện những điều trên, cá nhân tôi đã sử dụng các đối tượng JS dưới dạng các mảng kết hợp có sẵn bên ngoài.
Tuy nhiên , tôi muốn đặc biệt đề cập đến hai phương pháp thực sự tỏ ra hữu ích để biến nó thành một trải nghiệm bảng băm thuận tiện.
Viz: dict.hasOwnProperty (key) và xóa dict [key]
Đọc bài đăng này như một tài nguyên tốt về việc triển khai / sử dụng này. Tự động tạo khóa trong mảng liên kết JavaScript
Cảm ơn!
Một câu hỏi cũ nhưng gần đây tôi cần thực hiện một cổng AS3> JS và vì lợi ích của tốc độ, tôi đã viết một đối tượng Từ điển kiểu AS3 đơn giản cho JS:
http://jsfiddle.net/MickMalone1983/VEpFf/2/
Nếu bạn không biết, từ điển AS3 cho phép bạn sử dụng bất kỳ đối tượng nào làm khóa, trái ngược với chỉ chuỗi. Chúng rất hữu ích khi bạn đã tìm thấy công dụng của chúng.
Nó không nhanh như một đối tượng gốc, nhưng tôi không tìm thấy bất kỳ vấn đề đáng kể nào với nó về mặt đó.
API:
//Constructor
var dict = new Dict(overwrite:Boolean);
//If overwrite, allows over-writing of duplicate keys,
//otherwise, will not add duplicate keys to dictionary.
dict.put(key, value);//Add a pair
dict.get(key);//Get value from key
dict.remove(key);//Remove pair by key
dict.clearAll(value);//Remove all pairs with this value
dict.iterate(function(key, value){//Send all pairs as arguments to this function:
console.log(key+' is key for '+value);
});
dict.get(key);//Get value from key
Firefox 13+ cung cấp triển khai thử nghiệm mapđối tượng tương tự như dictđối tượng trong python. Thông số kỹ thuật tại đây .
Nó chỉ có sẵn trong firefox, nhưng nó trông đẹp hơn so với việc sử dụng các thuộc tính của a new Object(). Trích dẫn từ tài liệu:
- Một Đối tượng có một nguyên mẫu, vì vậy có các khóa mặc định trong bản đồ. Tuy nhiên, điều này có thể được bỏ qua bằng cách sử dụng
map = Object.create(null).- Các khóa của an
ObjectlàStrings, trong đó chúng có thể là bất kỳ giá trị nào đối với aMap.- Bạn có thể
Mapdễ dàng nhận được kích thước của một trong khi bạn phải theo dõi thủ công kích thước cho mộtObject.