2009-09-15 2 views
8

Что такое синтаксис для indexOf() для прохождения через многомерный массив? Например:indexOf синтаксис для многомерных массивов?

var x = []; 
// do something 
x.push([a,b]); 

x.indexOf(a) // ?? 

Я хочу найти 'a' и сделать что-то с 'b'. Но это не работает ... Поскольку этот метод должен быть итеративным, я не предполагаю, что использование любой другой итерации было бы неплохо. В настоящее время я имитирую это с использованием 2 простых массивов, но я думаю, что это должно как-то работать тоже ...

+0

Вы пытаетесь создать словарь? Почему бы не использовать объект? '{}' – Joel

+0

Было ли для вас какое-либо из четырех предложений по кодированию? Просто любопытно. – dlamblin

ответ

0

JavaScript не имеет многомерных массивов как таковых, поэтому x - всего лишь массив. Кроме того, метод Array indexOf не поддерживается во всех браузерах, в частности IE (по крайней мере, до версии 7), только в JavaScript 1.6.

Ваш единственный вариант - искать вручную, итерации по x и поочередно изучать каждый элемент.

1

Если вы не хотите, чтобы сохранить порядок, это гораздо проще использовать словарь:

var x = {}; 

// do something 

x[a] = b; 

Вы можете все еще перебора ключей, хотя порядок не определен:

for (var key in x) { 
    alert(x[key]); 
} 
+0

Используйте x [a] вместо x.a. «a» - это не имя ключа, а переменная, содержащая ключ. –

+0

true. Я исправлю это. –

0
x[ x.indexOf(a) ] 

Это будет работать только с упорядоченными объектами/списками и только если определено Array.prototype.indexOf.

x = [1,2], b = {one:function(){alert('gj')}}, c = x.push(b); 

x[ x.indexOf(b) ]['one']() 
+0

Я пробовал это, он не работает по какой-то причине ... – jirkap

+0

Ну, вы, должно быть, сделали это по-другому, потому что так, как я это делал, это работает. Я заметил, что это * ТОЛЬКО * работает с массивами, которые численно упорядочены и имеют свойство length, а не на «многомерных» или словарях. –

+0

Примечание. Вам также необходимо иметь ссылку на исходный объект для ссылки, которую вы подаете на «b», аналогичный объект со схожими свойствами по-прежнему отличается. –

1

Вы можете использовать объект (или словарь), предложенный Филиппом Лейбаетом. Это позволит получить быстрый доступ к элементам:

var x = {}; 

x[a] = b; // to set 

alert(x[a]) // to access 

Но если вы настаиваете на использовании indexOf, есть еще способ, однако некрасиво это:

var x = []; 

var o = Object(a); // "cast" to an object 
o.b = b; // attach value 

x.push(o); 

alert(x.indexOf(a)); // will give you the index 
alert(x[1].b); // access value at given index 
3

Просто: indexOf() не работает таким образом. Это может сработать, если вы сделали что-то вроде этого:

var x = []; 
// do something 
z = [a,b]; 
x.push(z); 

x.indexOf(z); 

Но тогда у вас уже есть z.b, не так ли? Так что, если вы должны игнорировать советы всех, кто считает, что с помощью объекта (или словарь) на самом деле проще, вам придется использовать либо Ates Goral «s approach, или поиск по индексу самостоятельно:

Array.prototype.indexOf0 = 
    function(a){for(i=0;i<this.length;i++)if(a==this[i][0])return i;return null;}; 
var x = []; 
// do something 
x.push([a,b]); 

x.indexOf0(a); //=> 0 
Смежные вопросы