Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.06.2013, 23:02
Аспирант
Отправить личное сообщение для Lynatik Посмотреть профиль Найти все сообщения от Lynatik
 
Регистрация: 11.09.2012
Сообщений: 35

Поиск объектов в массиве
Доброго времени суток всем.
Подвернулось задание- Имеется массив с объектами, имеющими поле «id» с уникальными значениями в пределах этого массива. Требуется искать объекты в этом массиве, имеющие определенное значение «id». Плюсы и минусы.

Самый очевидный способ(тупо перебрать массив до попадания) я сделал. Сначала для теста массив создал.
function Obj(id){
	this.id = id
}

var arr = [];

for (var j = 0; j < 5000000; j++){
	var obj = new Obj(j);
	arr.push(obj);	
}

var init="time";
const FINDID = 4999999;

function findEl(array) {
	for (var i = 1; i < (array.length + 1); i++){
		if (array[i].id == FINDID){
			console.log ("this is " + i + " element");
			break
		}
	}
}
console.time(init);
findEl(arr);
console.timeEnd(init);


Написал, что если большое количество объектов, то поиск возможно долгий будет. По времени функция такая ~120.000ms выполняется.

НО. Какие варианты еще есть? Может кто поможет?

Может еще взять все объекты из массива, склеить их в строку, разделяя чем- нибудь, типа (obj1.id тут уже строковая будет)
var str = "obj1.id#obj2.id#и так далее";


и потом уже искать в строке. Но это порнография какая- то уже получается, да и, наверняка долго будет.
Я новичок в программировании, особо не хайте
Спасибо огромное тому, кто наведет на путь истинный
Ответить с цитированием
  #2 (permalink)  
Старый 18.06.2013, 23:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Сообщение от Lynatik
for (var i = 1; i < (array.length + 1); i++){
интересно куда делся 0 элемент массива и существует ли элемент array.length ?
Ответить с цитированием
  #3 (permalink)  
Старый 18.06.2013, 23:29
Аспирант
Отправить личное сообщение для Lynatik Посмотреть профиль Найти все сообщения от Lynatik
 
Регистрация: 11.09.2012
Сообщений: 35

Я затупил что - то)) Спасибо
for (var i = 0; i < array.length; i++){
		if (array[i].id == FINDID){
			console.log ("this is " + (i + 1) + " element");
			break
		}
	}


А по самому варианту поиска подскажет кто- нибудь?
Ответить с цитированием
  #4 (permalink)  
Старый 18.06.2013, 23:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Lynatik,
если вы сами формируите массив -- то можно создать обьект где ключами будут id, а значениями индексы массива, тогда поиск будет почти мгновенный.
Ответить с цитированием
  #5 (permalink)  
Старый 19.06.2013, 00:22
Аспирант
Отправить личное сообщение для Lynatik Посмотреть профиль Найти все сообщения от Lynatik
 
Регистрация: 11.09.2012
Сообщений: 35

Сообщение от рони Посмотреть сообщение
если вы сами формируите массив -- то можно создать обьект где ключами будут id, а значениями индексы массива, тогда поиск будет почти мгновенный.
Но тогда же у нас все равно будет много ключей и индексов и все равно придется их перебирать...не понял я что-то((
Можно ли, пожалуйста, немного поподробнее? желательно с парой строчками кода
Ответить с цитированием
  #6 (permalink)  
Старый 19.06.2013, 00:28
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

бинарный поиск
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #7 (permalink)  
Старый 19.06.2013, 00:41
Аспирант
Отправить личное сообщение для Lynatik Посмотреть профиль Найти все сообщения от Lynatik
 
Регистрация: 11.09.2012
Сообщений: 35

nerv_ спасибо, но это не то вроде. Вдруг id не по порядку идут

рони вроде понял, про что Вы говорите.
но что- то не допру как сам цикл сделать, где ассоциативный массив заполняем id-шниками

Последний раз редактировалось Lynatik, 19.06.2013 в 01:01.
Ответить с цитированием
  #8 (permalink)  
Старый 19.06.2013, 01:19
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Lynatik
спасибо, но это не то вроде. Вдруг id не по порядку идут
сортировку для чего придумали? Какой вопрос, такой ответ.

var hash = {};

hash[ 'key' ] = 'value';

alert( hash.key );
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 19.06.2013, 01:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

Сообщение от Lynatik
как сам цикл сделать, где ассоциативный массив заполняем id-шниками
var hash = {};
 function Obj(id){
	this.id = id
}
var arr = [];
for (var j = 0; j < 5000000; j++){
    hash[j] = j;
    var obj = new Obj(j);
	arr.push(obj);
}

var init="time";
const FINDID = 4999999;

function findEl() {
   return hash[FINDID]

}
console.time(init);
findEl(arr);
console.timeEnd(init);
Ответить с цитированием
  #10 (permalink)  
Старый 19.06.2013, 11:20
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Lynatik,
Сообщение от рони
если вы сами формируите массив -- то можно создать обьект где ключами будут id, а значениями индексы массива, тогда поиск будет почти мгновенный.
А если хешей не будет и массив не упорядочен, то можно использовать такой поиск:
function Obj(id){
    this.id = id
}
 
var arr = [];
 
for (var j = 0; j < 5000000; j++){
    var obj = new Obj(j);
    arr.push(obj); 
}
 
var init="time";
const FINDID = 4999999;
 
function findEl(array) {
    array[array.length] = new Obj(FINDID);
    for (var i = 0; array[i].id != FINDID ; i++){}
    if (i == (array.length - 1))
         alert( "Искомое значение не найдено." );
    else
         alert( i );
}
console.time(init);
findEl(arr);
console.timeEnd(init);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск подструктуры в массиве json данных amt779 Общие вопросы Javascript 4 07.06.2013 18:53
Поиск в массиве, частичное совпадение фонарик Общие вопросы Javascript 25 04.04.2013 07:43
поиск HTMLElement'а в массиве z700i Общие вопросы Javascript 15 07.01.2012 21:13
Быстрый поиск объектов Shasoft Общие вопросы Javascript 7 30.07.2009 05:28
Поиск в массиве через JavaScript Noran Общие вопросы Javascript 0 10.08.2008 17:31