2011-12-29 44 views
7

thể trùng lặp:
indexOf method in an object array?Trục trặc khi sử indexOf trên một mảng phức tạp

Tôi có một mảng javascript mà sau định dạng này:

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

Có cách nào mà Tôi có thể sử dụng array.indexOf để tìm một chỉ mục trong mảng, khi ví dụ tôi biết biến "id".

Ví dụ: tôi đã thử;

var position = arrayName.indexOf("b"); 
arrayName[position].gender = "man" 

Hiện tại tôi đang sử dụng;

for(var i=0; i<arrayName.length; i++) { 
    if(arrayName[i].id == "b"){ 
     arrayName[i].gender = "man"; 
    } 
} 

này thứ hai công trình kỹ thuật nhưng các mảng thực tế tôi đang sử dụng có 150 bài dự thi và 10 mục trong mỗi mục để lặp qua tất cả dường như rất lãng phí khi tôi biết "id" của entry Tôi muốn chỉnh sửa. indexOf sẽ là một cách tiếp cận sạch hơn nhiều nếu tôi có thể làm cho nó hoạt động.

+2

Chỉ mục gọiOf trên mảng không tương thích với trình duyệt chéo. – erturne

+0

@erturne - bạn nói đúng - thậm chí không có trong IE8 - wow –

+1

@erturne: Không phải, nhưng [như đã nêu trên Mạng nhà phát triển Mozilla] (https://developer.mozilla.org/en/JavaScript/Reference/ Global_Objects/Array/indexOf), nó có thể dễ dàng được triển khai ngay cả trong các trình duyệt cũ/không được chấp nhận. – Tadeck

Trả lời

18

Cuộc gọi của bạn tới indexOf đang kiểm tra các đối tượng trong mảng của bạn dựa trên chuỗi b, thao tác này sẽ không bao giờ hoạt động.

Lặp qua các phần tử mảng để tìm đúng id là một giải pháp đơn giản.

Hoặc, bạn có thể thực hiện chức năng indexOf của riêng bạn:

Array.prototype.indexOfId = function(id) { 
    for (var i = 0; i < this.length; i++) 
     if (this[i].id === id) 
      return i; 
    return -1; 
} 

    var arrayName = [ 
     { id: "a", gender: "man", item: "stuff" }, 
     { id: "b", gender: "woman", item: "stuff" }, 
     { id: "c", gender: "man", item: "stuff" }, 
     { id: "d", gender: "man", item: "stuff" }]; 

    var position = arrayName.indexOfId("b"); 

    alert(position); //alerts 1 

Dưới đây là một

EDIT

Nếu bạn muốn so sánh các phần tử mảng của bạn để sở hữu bất kỳ, đây là fiddle cách bạn làm điều đó (lưu ý rằng tôi đang sử dụng cú pháp [] để nhận được một thuộc tính tùy ý)

Array.prototype.indexOfField = function (propertyName, value) { 
     for (var i = 0; i < this.length; i++) 
      if (this[i][propertyName] === value) 
       return i; 
     return -1; 
    } 

    var position = arrayName.indexOfField("id", "b"); 
    alert(position); //alerts 1 

    position = arrayName.indexOfField("gender", "man"); 
    alert(position); //alerts 0 

Hoặc, nếu bạn không muốn gây rối với nguyên mẫu Array Avatar của, và bạn không nhớ sử dụng các tính năng không có mặt trong các trình duyệt cũ hơn, bạn có thể sử dụng filter chức năng Array Avatar của

var position = arrayName.indexOf(arrayName.filter(function (val) { 
     return val.id === "b"; 
})[0]); 

Lưu ý rằng điều này chức năng không có trong IE8 và vì vậy để hỗ trợ trình duyệt này, bạn phải lấy shim from MDN

EDIT - oops, indexOf không thân thiện với các trình duyệt cũ.Nếu bạn lựa chọn không cho bit thứ hai mã này và muốn hỗ trợ IE, bạn cũng sẽ phải lấy shim cho indexOf from here

+0

Cảm ơn Adam, đó là điều tôi nghi ngờ. Tôi có lẽ sẽ đi trước và sử dụng một biến thể của kỹ thuật prototype.indexOfId của bạn như là loại chỉnh sửa khá phổ biến vì vậy nó sẽ được sạch hơn để tham chiếu đến một chức năng nguyên mẫu duy nhất. Biến thể của tôi có thể là: Array.prototype.indexOfId = function (biến, giá trị) { cho (var i = 0; i Nick

+0

@ user1121506 - điều đó sẽ không hoạt động - đứng bởi một chỉnh sửa khác –

+0

@ user1121506 - chỉnh sửa - mã trong nhận xét của bạn đúng 99,9%, bạn chỉ cần một chút tinh chỉnh. –

0

bạn có thể ghi đè lên indexOf sử dụng prototype

Array.prototype.indexOf = function(elem) { 
    for (var i = 0; i < this.length; i++){ 
     if (this[i].id === elem) 
      return i; 
    } 
    return -1; 
} 

var arrayName = [ 
{id: "a", gender: "man", item: "stuff"}, 
{id: "b", gender: "woman", item: "stuff"}, 
{id: "c", gender: "man", item: "stuff"}, 
{id: "d", gender: "man", item: "stuff"} 
]; 

alert(arrayName.indexOf("b")); 

fiddle: http://jsfiddle.net/r8rp9/1/

1

Nếu bạn có cơ hội, bạn có thể sử dụng Array.prototype.filter:

var arrayName = [ 
    {id: "a", gender: "man", item: "stuff"}, 
    {id: "b", gender: "woman", item: "stuff"}, 
    {id: "c", gender: "man", item: "stuff"}, 
    {id: "d", gender: "man", item: "stuff"} 
]; 

console.log(arrayName.filter(function(i) { 
    return i.id === 'b'; 
})); 

Điều gì sẽ g ive:

[ { id: 'b', gender: 'woman', item: 'stuff' } ] 
+0

Nếu tôi muốn tìm chỉ mục và xóa phần tử thì sao? –

+0

Chỉ cần trả lại i.id! == 'b'; 'thay thế. – NiKo

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