2011-11-29 36 views

Trả lời

38
for(var i = 0; i < myArray.length; i++) { 
    if(myArray[i].color === 'blue') { 
    return i; 
    } 
} 

Không có "sạch" đường trừ khi bạn muốn bao gồm một thư viện của bên thứ ba. Underscore là một lựa chọn tốt cho những thứ như thế này.

+0

Liên kết trong câu trả lời này đã bị hỏng ngay bây giờ. –

+0

@AndersonGreen cố định, cảm ơn bạn! Ngoài ra, câu trả lời này là khá cũ. Tôi khuyên bạn nên Lodash bây giờ. ES5 cũng cung cấp một native find() thực hiện cho nguyên mẫu Array. –

0

Lặp lại mảng, tìm giá trị bên trong từng đối tượng phần tử. JavaScript thô không cung cấp cho bạn nhiều thứ để làm việc cùng.

+0

... Tôi lấy nó không có indexOf cho một mảng đa chiều? – redconservatory

+2

@redconservatory Vâng, đó không phải là mảng đa chiều. Nhưng không, không có. Có rất nhiều cách triển khai bạn có thể thêm vào mẫu thử nghiệm mảng hoặc chỉ cần thực hiện thủ công. –

+0

không có. Nhưng tôi chỉ muốn chắc chắn rằng bạn có một cái gì đó rõ ràng ở đây ... có vẻ như câu hỏi của bạn là để tìm kiếm chìa khóa của một giá trị, mà sẽ giống như php's array_search(). Nhưng "indexOf" là giống như strpos của php() trong đó nó trông để xem nếu một chuỗi nằm trong chuỗi khác (và trả về vị trí của sự xuất hiện). –

9

Đó không phải là mảng đa chiều (hoặc thậm chí là một mảng răng cưa, được sử dụng thay cho mảng đa chiều trong Javascript vì chúng không tồn tại). Đó là một mảng các đối tượng.

Bạn có thể lặp qua các mục trong mảng:

var index; 
for (var i = 0; i < myArray.length; i++) { 
    if (myArray[i].color == 'blue') { 
    index = i; 
    break; 
    } 
} 

Bây giờ biến index chứa giá trị 1, với ví dụ cho bạn.

+0

Bài học tốt về mảng ... cảm ơn. – redconservatory

2

Tôi đoán bạn có ý nghĩa gì từ ví dụ của mình để trả về "1"? Đây là một chức năng cho bạn ...

<script type='text/javascript'> 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
function getIndexOf(a,v) { 
    var l = a.length; 
    for (var k=0;k<l;k++) { 
    if (a[k].color==v) { 
     return k; 
     } 
    }      
    return false; 
} 

alert (getIndexOf(myArray,'blue')); 
</script> 
2

Ví dụ như thế này:

DEMO

Array.prototype.objIndexOf = function(val) { 
    var cnt =-1; 
    for (var i=0, n=this.length;i<n;i++) { 
     cnt++; 
     for(var o in this[i]) { 
     if (this[i].hasOwnProperty(o) && this[i][o]==val) return cnt; 
     } 
    } 
    return -1; 
} 
var myArray = [ 
       { 
        'color':'red', 
        'name': 'redName' 
       }, 
       { 
        'color':'blue', 
        'name': 'blueName' 
       }, 
       { 
        'color':'green', 
        'name': 'greenName' 
        }, 
       { 
        'color':'yellow', 
        'name': 'yellowName' 
       }, 
      ]; 
    alert(myArray.objIndexOf('blue')) 
+0

-1 bạn không nên mở rộng các đối tượng javascript gốc như Array – qodeninja

+0

câu trả lời 1 năm tuổi và bạn bận tâm đến downvote. Shees. http://stackoverflow.com/questions/8859828/javascript-what-dangers-are-in-extending-array-prototype Đủ tốt cho MDN, đủ tốt cho tôi: https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Global_Objects/Array/filter – mplungjan

+1

haha ​​Tôi đã không thực sự downvote =) vì nó đã là 0. 1 năm sau và câu hỏi này vẫn còn liên quan đến thứ tôi đang tìm kiếm. – qodeninja

38

Nếu bạn đã sử dụng ECMAScript 5 trong mã của bạn, bạn có thể sử dụng:

myArray 
    .map(function (element) {return element.color;}) 
    .indexOf('blue'); 

Lưu ý rằng sự ủng hộ đối với các chức năng là khá hạn chế (chúng không hoạt động trên Internet Explorer 8).

Ngoài ra, nếu bạn đang ở trong tương lai, và bạn đang sử dụng ES6 bạn có thể làm điều đó:

myArray.map((el) => el.color).indexOf('blue'); 

Đó là tương tự như trên, nhưng nhỏ hơn.

+0

đây là một giải pháp thanh lịch – DariusVE

+2

"nếu bạn đang ở trong tương lai" kudo! – Madivad

+0

Đó là công việc tuyệt vời –

12

Tôi biết đây là siêu cũ nhưng Javascript es6 có một phương pháp tuyệt vời Array.prototype.findIndex(), vì vậy bạn chỉ có thể làm:

let index = myArray.findIndex((item) => item.color === 'blue'); 
// value of index will be "1" 
+0

perfec trả lời !!! – SagarPPanchal

-1

Bạn có thể sử dụng .findIndex() method

Trong trường hợp của bạn

var findeMe = "blue"; 
myArray.findIndex(function(row){ 
return row.color == findMe; 
}); 

Tôi hy vọng nó giúp.

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