var dict = []; // create an empty array
dict.push({
key: "keyName",
value: "the value"
});
// repeat this last part as needed to add more key/value pairs
Về cơ bản, bạn đang tạo một đối tượng bằng chữ với 2 thuộc tính (được gọi key
và value
) và chèn nó (sử dụng push()
) vào mảng.
Chỉnh sửa: Vì vậy, gần 5 năm sau, câu trả lời này đang bị hạ thấp bởi vì nó không tạo ra một đối tượng JS "bình thường" theo nghĩa đen (còn gọi là map, aka hash, aka dictionary). Tuy nhiên,
nó đang tạo ra cấu trúc mà OP yêu cầu (và được minh họa trong câu hỏi khác được liên kết đến), đó là một mảng gồm các đối tượng bằng chữ , mỗi đối tượngkey
và value
thuộc tính. Đừng hỏi tôi tại sao cấu trúc đó là bắt buộc, nhưng đó là cấu trúc được yêu cầu.
Nhưng, nhưng, nếu những gì bạn muốn trong một đối tượng JS đơn giản - chứ không phải cấu trúc mà OP yêu cầu - hãy xem câu trả lời của tcll , mặc dù ký hiệu ngoặc là hơi cồng kềnh nếu bạn chỉ có các khóa đơn giản là tên JS hợp lệ. Bạn chỉ có thể làm điều này:
// object literal with properties
var dict = {
key1: "value1",
key2: "value2"
// etc.
};
Hoặc sử dụng ký hiệu chấm thông thường để đặt thuộc tính sau khi tạo đối tượng:
// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.
Bạn thực sự muốn ký hiệu khung nếu bạn có các khóa có khoảng trắng trong đó, các ký tự đặc biệt hoặc những thứ tương tự. Ví dụ:
var dict = {};
// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";
// but this will
dict["some invalid key (for multiple reasons)"] = "value1";
Bạn cũng muốn ký hiệu khung nếu các phím của bạn là động:
dict[firstName + " " + lastName] = "some value";
Lưu ý rằng các khóa (tên thuộc tính) luôn là các chuỗi và các giá trị không phải là chuỗi sẽ được ép buộc thành một chuỗi khi được sử dụng làm khóa. Ví dụ: một Date
đối tượng được chuyển đổi thành biểu diễn chuỗi của nó:
dict[new Date] = "today's value";
console.log(dict);
// => {
// "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
// }
Tuy nhiên, lưu ý rằng điều này không nhất thiết "chỉ hoạt động", vì nhiều đối tượng sẽ có biểu diễn chuỗi như "[object Object]"
không tạo ra khóa không duy nhất. Vì vậy, hãy cảnh giác với một cái gì đó như:
var objA = { a: 23 },
objB = { b: 42 };
dict[objA] = "value for objA";
dict[objB] = "value for objB";
console.log(dict);
// => { "[object Object]": "value for objB" }
Mặc dù objA
và objB
là các yếu tố hoàn toàn khác biệt và độc đáo, cả hai đều có cùng biểu diễn chuỗi cơ bản : "[object Object]"
.
Lý do Date
không hành xử như thế này là Date
nguyên mẫu có một tùy chỉnhtoString
phương thức ghi đè biểu diễn chuỗi mặc định. Và bạn có thể làm tương tự:
// a simple constructor with a toString prototypal method
function Foo() {
this.myRandomNumber = Math.random() * 1000 | 0;
}
Foo.prototype.toString = function () {
return "Foo instance #" + this.myRandomNumber;
};
dict[new Foo] = "some value";
console.log(dict);
// => {
// "Foo instance #712": "some value"
// }
(Lưu ý rằng vì ở trên sử dụng một số ngẫu nhiên , các xung đột tên vẫn có thể xảy ra rất dễ dàng. Nó chỉ để minh họa cho việc thực hiện toString
.)
Vì vậy, khi cố gắng sử dụng các đối tượng làm khóa, JS sẽ sử dụng toString
triển khai riêng của đối tượng , nếu có hoặc sử dụng biểu diễn chuỗi mặc định.