2011-12-29 13 views
7

Powiel możliwe:
indexOf method in an object array?Kłopoty przy użyciu indexOf na złożonym tablicy

Mam javascript tablicę które towarzyszą tego formatu:

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

Czy istnieje sposób, że Mogę użyć array.indexOf do znalezienia indeksu w tablicy, gdy na przykład znam zmienną "id".

Na przykład próbowałem;

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

W tej chwili używam;

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

Ten drugi działa technika ale rzeczywista tablica używam ma 150 wpisów i 10 sztuk w każdej pozycji tak pętli przez to wszystko wydaje się bardzo rozrzutny, gdy wiem „id” wpisu chcę edytować. indexOf byłoby znacznie czystsze podejście, jeśli mogę go uruchomić działa.

+2

Wywołanie indexOf na tablicy nie jest kompatybilne z wieloma przeglądarkami. – erturne

+0

@erturne - masz rację - nie ma go nawet w IE8 - wow –

+1

@erturne: Nie jest, ale [jak podano w Mozilla Developer Network] (https://developer.mozilla.org/en/JavaScript/Reference/ Global_Objects/Array/indexOf), można go łatwo zaimplementować nawet w starszych/przestarzałych przeglądarkach. – Tadeck

Odpowiedz

18

Twoje połączenie z indexOf polega na sprawdzaniu obiektów w twojej tablicy przed ciągiem b, który nigdy nie zadziała.

Zapętlenie elementów tablicy w celu znalezienia odpowiedniego identyfikatora jest prostym rozwiązaniem.

Albo można zrobić własną funkcję IndexOf:

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 

Oto fiddle

EDIT

Jeśli chcesz porównać swoje elementy tablicy do jakiejkolwiek własności, oto jak cię zrób to (zauważ, że używam składni [] do uzyskania dowolnej właściwości)

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 

Lub, jeśli nie chcą zadzierać z prototypem tablicę, a nie masz nic przeciwko użyciu funkcji nie przedstawi w starszych przeglądarkach, można użyć filter funkcji Array

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

pamiętać, że ta funkcja nie jest obecny w IE8, a więc do wspierania tej przeglądarki musiałbyś chwycić shim from MDN

EDIT - ups, indexOf nie jest przyjazny wobec starych przeglądarek albo.Jeśli zdecyduje się na tego drugiego kawałka kodu i chciał wspierać IE, którą również trzeba chwycić za podkładkę indexOf from here

+0

Dzięki Adam, właśnie to podejrzewałem. Prawdopodobnie zastosuję odmianę waszej techniki prototype.indexOfId, ponieważ tego rodzaju zmiany są dość powszechne, więc będzie czystsze odniesienie do jednej funkcji prototypowej. Moją odmianą będzie prawdopodobnie: Array.prototype.indexOfId = funkcja (zmienna, wartość) { dla (var i = 0; i Nick

+0

@ user1121506 - to nie zadziała - pozostańcie przy kolejnej edycji –

+0

@ user1121506 - edytujcie - kod w komentarzu poprawił się o 99,9%, wystarczyło trochę drobnych poprawek. –

0

można zastąpić indexOf użyciu 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")); 

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

1

Jeśli masz możliwość, możesz użyć 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'; 
})); 

które będą g ive:

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

Co zrobić, jeśli chcę znaleźć indeks i usunąć element? –

+0

Po prostu 'return i.id! == 'b';' zamiast. – NiKo

Powiązane problemy