2013-09-07 3 views
5

Я сожалею, если это было предложено ранее, это то, что трудно найти ...Javascript массив Key Поиск

Я хочу использовать яваскрипт массив для хранения объектов, с ключом как ID

, например, скажем, у меня была куча людей, которые имеют различные идентификаторы

var people = new Array(); 
var person = {property: value}; // this is person ID 4 

var people[4] = person; 

Я хочу, чтобы иметь возможность ссылаться на то, что пользователь, говоря, люди [ID] .propery

Проблема в том, что выход этого массива теперь будет;

null,null,null,null,object 

Потому что он ожидает ключи быть 0,1,2,3,4

Могу ли я глуп или что-то? :-) Мы можем сделать это для строк правильно, так почему бы не несекретные числа?

То, что я пытаюсь избежать в необходимости перебрать каждый объект в массиве каждый раз, когда я хочу, чтобы получить доступ к конкретному человеку внутри него, поэтому я решил, что с помощью идентификационного номера в качестве ключа будет работать

Спасибо, ребята! :-)

+1

Что означает «выход массива»? Да, массивы в JS разрежены, и вы можете лучше рассмотреть использование объектов в этом случае, но я признаю, что до сих пор не понимаю, что не так в примере, который вы показали. – raina77ow

+1

_ «выход этого массива теперь будет« null, null, null, null, object' »_ - Массивы действительно не имеют« выход ».У вашего массива будет один элемент в индексе 4, и если вы попытаетесь получить доступ к нижним индексам, например, 'people [2]', вы получите 'undefined', а не' null'. Также у вас есть синтаксическая ошибка в 'var people [4] = person;', вам нужно удалить 'var'. – nnnnnn

ответ

7

Используйте объект словаря

var people = {}; 
people[4] = 'me'; 
1

когда мы используем строку в качестве ключа, например:

var people = {}; //this is an object 
people[name] = 'toto'; 

мы добавляем новое свойство этого объекта, потому что каждый объект в JavaScript можно рассматривать как хэш-таблицу.

Если вы используете массив, он по-прежнему является объектом, вы можете добавить к нему свойства, используя строку в качестве ключа. Но если вы делаете что-то вроде people[4] = 'toto';, вы добавляете строку в массив, тогда длина массива будет равна 5. Конечно, число 4 все равно будет свойством этого объекта массива.

3

Я предлагаю вам использовать коллекции. Коллекция представляет собой массив объектов. Затем вы можете передать свойства каждому человеку. Вы можете отфильтровать свою коллекцию любым свойством. Так близко к тому, что вы делаете, но вместо ретрансляции по индексу передайте id для каждого человека.

var people = []; // a collection 

var person = { 
    id: 4, 
    name: 'John' 
}; 

people.push(person); 

// Filtering: 

// By id 
var john = people.filter(function(person) { 
    return person.id == 4; 
}); 

// By name 
var john = people.filter(function(person) { 
    return person.name == 'John'; 
}); 

Вы можете абстрагировать эти циклы, чтобы повторно использовать их. Также убедитесь, что ваши идентификаторы уникальны. Если данные поступают из БД, это должно быть ОК, иначе я буду отслеживать их где-нибудь.

Преимущество коллекций, в отличие от простого объекта с ключами, состоит в том, что вы можете сортировать и фильтровать, в то время как объект, в котором порядок свойств не гарантируется, вы не можете сделать это просто.

Обратите внимание, что filter работает только на "современных браузерах", поэтому IE9 +, но есть polyfills для старых браузеров.

Смежные вопросы