có từ điển nào bằng javascript như python không?


100

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?



5
Câu trả lời bạn chấp nhận là rất sai.
Esben Skov Pedersen

@EsbenSkovPedersen Bạn nhận thấy lỗi nào trong câu trả lời đó?
Anderson Green

Tôi thấy nó được chỉnh sửa sau khi tôi nhận xét. Có vẻ như: đã mất tích
Esben Skov Pedersen

2
Đọc câu trả lời mới nhất cho ES6 Maps stackoverflow.com/a/32993723/1993919 (cho ý kiến đối với cùng một lý do nó đã được đăng)
Old Badman Grey

Câu trả lời:


130

Đâ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"]
};

11
Cần lưu ý rằng ví dụ đầu tiên phải mang lại cùng một đối tượng trong cả hai ngôn ngữ bằng cách sử dụng cùng một cú pháp ngoại trừ dấu đóng ';'. State_dictionary = {"CT": ["alex", "harry"], "AK": ["liza", "alex"], "TX": ["fred", "harry"]}
Denis C

Tôi quen với ký hiệu đối tượng theo nghĩa đen hơn, vì bạn truy cập chúng theo cùng một cách, sự khác biệt giữa hai là gì?
John Demetriou

2
@JohnDemetriou sự khác biệt chính là khóa ký hiệu đối tượng javascript phải là chuỗi (được đặt trong dấu ngoặc kép ""). Ký hiệu đối tượng được thấy trong JSON để trao đổi dữ liệu và được lấy cảm hứng từ ký hiệu đối tượng theo nghĩa đen; cần lưu ý rằng JSON thường được sử dụng trong ngữ cảnh chuỗi
Chief

2
Trên thực tế, Python cho phép phẩy statement-chấm dứt, vì vậy ví dụ đầu tiên là hoàn toàn hợp lệ bất kể bằng Python và JavaScript
celticminstrel

Nếu giá trị đến từ người dùng, thì cần phải cẩn thận khi sử dụng Object.hasOwnProperty.call(dictionary, key)(nếu không, người dùng có thể nhập giá trị valueOfdictionary['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.
robocat

50

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.


3
Còn về màn trình diễn? tìm kiếm một chìa khóa trong một đối tượng thời gian không đổi?
Saher Ahwal

5
Vì o ["key"] tương đương với o.key trong Javascript nên hiệu suất gần như giống nhau. Tuy nhiên, hiệu suất phụ thuộc vào Javascript Engine / Webbrowser. Có khá nhiều khác biệt giữa chúng, đặc biệt là trong các phiên bản cũ.
Alex,

ECMAScript 6 định nghĩa một đối tượng Bản đồ chính thức (nghĩa là "Không có mảng liên kết thực nào trong Javascript" hiện không chính xác).
robocat

18

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({});

Phù hợp với tôi, rất vui khi sử dụng phương pháp ES6 sạch hơn. Cảm ơn bạn! Theo dõi, chúng tôi biết bất kỳ cách nào để "số lượng lớn set ()", ví dụ như python dict = { key: value)?
Joe Sadoski

10

Đã 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";
        }
    }
}

Việc triển khai trên hiện có thể được sử dụng để mô phỏng một từ điển như:

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) 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!


5

Sử dụng các đối tượng JavaScript. Bạn có thể truy cập các thuộc tính của chúng như khóa trong từ điển. Đây là nền tảng của JSON. Cú pháp tương tự như từ điển Python. Xem: JSON.org


4

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

1
Thư viện đẹp và hữu ích! Tôi đã thêm một hàm get, mà tôi nghĩ là bị thiếu và đã khắc phục một số vấn đề nhỏ về cú pháp (thiếu dấu chấm phẩy, v.v.). Đây là fiddle được sửa đổi: Từ điển trong JSFiddle
Matt

Bạn làm tốt lắm, dunno tại sao không có ở đó!
MickMalone1983,

2

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 ObjectStrings, trong đó chúng có thể là bất kỳ giá trị nào đối với a Map.
  • 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ột Object.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.