2009-09-06 35 views
8

1) Tôi có mảng này javascript:Finding chuỗi-key trong Javascript mảng

lang=new Array(); 
lang["sq"]="Albanian"; 
lang["ar"]="Arabic"; 
lang["en"]="English"; 
lang["ro"]="Romanian"; 
lang["ru"]="Russian"; 

2) Trong một số quá trình khác, có một giá trị trả về trong một biến:

result.detectedSourceLanguage = 'en'; 

3) Bây giờ, tôi muốn in tên đầy đủ của ngôn ngữ bằng cách thực hiện việc này:

alert(lang[result.detectedSourceLanguage]); 

Hộp thoại hiển thị: undefined

Bất kỳ ý tưởng nào?

BTW: im sử dụng JQuery, vì vậy các giải pháp JQuery được hoan nghênh.

+0

Bạn đã thử sử dụng chỉ mục chưa? 0,1,2,3? Khi khai báo biến bạn đã sử dụng VAR? Hãy thử gọi biến đó là "resultDetectedSourceLanguage" ... Không biết nói gì khác ... :) – Gavrisimo

+0

Có thể kiểm tra xem bạn có mảng được xác định bởi thời gian bạn đang cố gắng truy cập vào nó hay không. BTW Ý bạn là gì "trong một số quy trình khác"? – Jaime

+0

nếu tôi gọi: cảnh báo (lang ['en']); nó in tiếng Anh như nó cần. Vấn đề là khi tôi làm điều này: cảnh báo (lang [var1]); (trong đó var1 giữ giá trị 'en'). – andufo

Trả lời

21

An Array sử dụng chỉ mục số nguyên. Bạn có thể muốn một Object, mà hỗ trợ chỉ số chuỗi: (. Ví dụ thứ hai có lẽ là tốt hơn khi nhiều lập trình viên JS sẽ được hạnh phúc với nó)

lang=new Object(); 
lang["sq"]="Albanian"; 
lang["ar"]="Arabic"; 
lang["en"]="English"; 
lang["ro"]="Romanian"; 
lang["ru"]="Russian"; 

// or 

lang = { 
    'sq': 'Albanian', 
    'ar': 'Arabic', 
    // ... 
    'ru': 'Russian' 
}; 

+1

Chỉ cần lưu ý về lý do OP thỉnh thoảng làm việc: Trong JS Mảng là các đối tượng, vì vậy bạn có thể đính kèm các thuộc tính tùy ý cho chúng như bạn có thể với bất kỳ đối tượng nào khác. Như đã được tìm thấy mặc dù, các thuộc tính bổ sung này có thể bị mất nếu mảng được nối tiếp với cú pháp '['val 1', 'val 2', 'val 3, ...]' bình thường. Nó có khả năng là một nơi nào đó trong JQuery hoặc ở nơi khác một serialization/deserialization đang xảy ra với mảng, và các thuộc tính bổ sung bị mất. –

+0

Tôi biết một 'mảng 'là một' đối tượng', nhưng thực sự, bạn nên coi nó như một mảng tuần tự (như 'std :: vector' trong STL của C++) và không phải là mảng kết hợp (như' std :: map' trong C++ của STL hoặc PHP-như mảng), để tránh nhầm lẫn. Tuần tự hóa/chuyển đổi có thể là vấn đề như bạn đề nghị, Adam. – strager

0

Hãy thử cảnh báo result.detectedSourceLanguage ngay trước khi sử dụng. Có một cơ hội mà nó không bằng những gì bạn mong đợi nó. Điều này sẽ làm việc.

+0

thực tế là cảnh báo hiển thị: vi – andufo

+0

trình duyệt nào bạn đang chạy ứng dụng này? –

1

Kiểm tra loại và giá trị của result (và result.detectedSourceLanguage). Nó có thể là một trong những điều sau đây

  • result không được định nghĩa
  • result không phải là một đối tượng hoặc không có bất kỳ thuộc tính tên detectedSourceLanguage
  • Giá trị của result.detectedSourceLanguage không phải là một chuỗi hoặc không có chìa khóa như vậy trong lang (lúc đó nó phải trở undefined cho alert(lang[result.detectedSourceLanguage]);)

BTW, vấn đề của bạn không có gì để làm với jQuery

+0

không liên quan gì đến trình điều khiển. nếu tôi gọi: cảnh báo (lang ['en']); nó in tiếng Anh như nó cần. – andufo

3

Kịch bản này tạo ra một hộp thông báo (kiểm tra trong IE & FF) nói rằng "tiếng Anh":

lang = new Array(); 
lang["sq"] = "Albanian"; 
lang["ar"] = "Arabic"; 
lang["en"] = "English"; 
lang["ro"] = "Romanian"; 
lang["ru"] = "Russian"; 

detectedSourceLanguage = 'en'; 

alert(lang[detectedSourceLanguage]); 

vấn đề duy nhất có thể là đối tượng result.

+0

tôi đã thêm cảnh báo (lang [String (detectSourceLanguage)]); đã hoạt động. cảm ơn! – andufo