2012-02-14 41 views
22
var associativeArray = []; 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var key = null; 
for(key in associativeArray) 
{ 
    console.log("associativeArray[" + key + "]: " + associativeArray[key]);   
} 

key = 'key3'; 

var obj = associativeArray[key];   

// gives index = -1 in both cases why? 
var index = associativeArray.indexOf(obj); 
// var index = associativeArray.indexOf(key); 

console.log("obj: " + obj + ", index: " + index); 

Chương trình trên chỉ số in: -1, tại sao? Có cách nào tốt hơn để có được chỉ số của một đối tượng trong một mảng kết hợp mà không sử dụng vòng?javascript: cách lấy chỉ mục của đối tượng trong mảng liên kết?

Nếu tôi muốn xóa 'key3' khỏi mảng này thì sao? hàm ghép nối lấy tham số đầu tiên làm chỉ mục phải là một số nguyên.

+8

Không có mảng liên kết trong javascript. – Sarfraz

+0

có thể trùng lặp của [trong một đối tượng javascript, cách tốt nhất để có được thuộc tính của một giá trị là gì?] (Http://stackoverflow.com/questions/9052888/in-a-javascript-object-whats-best-way-to -get-the-attribute-of-a-value) – user123444555621

+0

http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/ –

Trả lời

34

indexOf chỉ hoạt động với các mảng Javascript thuần túy, tức là các chỉ số có chỉ số nguyên. "Mảng" của bạn thực sự là một đối tượng và phải được khai báo là như vậy

var associativeArray = {} 

Không có chỉ mục được xây dựngOf cho các đối tượng, nhưng thật dễ dàng để viết.

var associativeArray = {} 

associativeArray['key1'] = 'value1'; 
associativeArray['key2'] = 'value2'; 
associativeArray['key3'] = 'value3'; 
associativeArray['key4'] = 'value4'; 
associativeArray['key5'] = 'value5'; 

var value = 'value3'; 
for(var key in associativeArray) 
{ 
    if(associativeArray[key]==value) 
     console.log(key); 
} 

Nếu không có vòng (giả sử một trình duyệt hiện đại):

foundKeys = Object.keys(associativeArray).filter(function(key) { 
    return associativeArray[key] == value; 
}) 

trả về một mảng các phím có chứa các giá trị nhất định.

+1

Nếu tôi muốn xóa 'key3' khỏi điều này mảng? hàm ghép nối lấy tham số đầu tiên làm chỉ mục phải là một số nguyên. – gmuhammad

+2

@gmuhammad Phương thức 'splice()' chỉ hoạt động trên mảng, không phải đối tượng. Bạn sẽ cần phải loại bỏ thuộc tính bằng cách sử dụng 'delete associativeArray ['key3']', ví dụ. – GregL

+3

thg435: Bạn có thể gây ra một chút nhầm lẫn bằng cách sử dụng từ 'mảng' trong tên biến của bạn. Có lẽ 'associativeMap' có thể đã được tốt hơn để làm cho rõ ràng nó là một đối tượng, không phải là một mảng? – GregL

2

Nếu bạn không sử dụng jQuery, bạn có thể mở rộng nguyên mẫu của đối tượng thực hiện điều này:

// Returns the index of the value if it exists, or undefined if not 
Object.defineProperty(Object.prototype, "associativeIndexOf", { 
    value: function(value) { 
     for (var key in this) if (this[key] == value) return key; 
     return undefined; 
    } 
}); 

Sử dụng cách này thay vì phổ biến Object.prototype.associativeIndexOf = ... sẽ làm việc với jQuery nếu bạn sử dụng nó.

Và sau đó bạn có thể sử dụng nó như thế này:

var myArray = {...}; 
var index = myArray.associativeIndexOf(value); 

Nó cũng sẽ làm việc với mảng bình thường: [...], vì vậy bạn có thể sử dụng nó thay vì indexOf quá.

Hãy nhớ sử dụng các toán tử ba ký tự để kiểm tra nếu nó không xác định:

index === undefined // to check the value/index exists  
index !== undefined // to check the value/index does not exist 

Tất nhiên bạn có thể thay đổi tên của hàm nếu bạn thích ví dụ keyOf, và nhớ không phải khai báo bất kỳ biến được gọi là 'không xác định'.

Các vấn đề liên quan