Поиск объектов в массиве
Доброго времени суток всем.
Подвернулось задание- Имеется массив с объектами, имеющими поле «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#и так далее"; и потом уже искать в строке. Но это порнография какая- то уже получается, да и, наверняка долго будет. Я новичок в программировании, особо не хайте:) Спасибо огромное тому, кто наведет на путь истинный |
Цитата:
|
Я затупил что - то)) Спасибо
for (var i = 0; i < array.length; i++){ if (array[i].id == FINDID){ console.log ("this is " + (i + 1) + " element"); break } } А по самому варианту поиска подскажет кто- нибудь? |
Lynatik,
если вы сами формируите массив -- то можно создать обьект где ключами будут id, а значениями индексы массива, тогда поиск будет почти мгновенный. |
Цитата:
Можно ли, пожалуйста, немного поподробнее? желательно с парой строчками кода |
|
nerv_ спасибо, но это не то вроде. Вдруг id не по порядку идут
рони вроде понял, про что Вы говорите. но что- то не допру как сам цикл сделать, где ассоциативный массив заполняем id-шниками |
Цитата:
var hash = {}; hash[ 'key' ] = 'value'; alert( hash.key ); |
Цитата:
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); |
Lynatik,
Цитата:
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); |
рони Спасибо, все понял
Dim@ Спасибо за вариант, но он долгий очень накатал несколько вариантов за ночь Радует, что есть люди, готовые помочь. Человеческое спасибо всем! |
function Obj(id) { this.id = id ; } for(var arr = [], j = 0; j < 5000000; j++) arr.push(new Obj(j)) ; var init = "time" ; const FINDID = 4999999 ; function findEl(array) { var i = 0 ; array.some(function(obj) { i++ ; return obj.id === FINDID ; }) ; console.log("this is " + i + " element") ; } console.time(init) ; findEl(arr) ; console.timeEnd(init); |
Lynatik,
В каком смысле долгий? |
|
В задании ничего не было сказано про id. только то, что они уникальные.
Задание вроде сделал и отдал уже. Спасибо огромное всем за советы. Реально помогаете. А я учусь. Скоро тоже кому- нибудь смогу помогать) |
Цитата:
|
bes, а что же тогда?
|
bes,
действительно, что вы имеете ввиду?? о_О |
Цитата:
Цитата:
в спецификации они представлены объектами внутреннего типа Reference http://es5.javascript.ru/x8.html#x8.7 сами объекты, насколько я понимаю, хранятся обычно в куче (heap) |
Как вариант можно еще так:
function Obj(x) { this.id = x; this.toString = function() { return x; }; } var arr = [new Obj(1), new Obj(2), new Obj(3)]; console.log(arr[arr.join(',').indexOf('2')-1]); // искомый объект. Тут хорошо бы еще проверку, хотя все равно вернет undefined |
eugasl, а если это объекты?
|
Цитата:
|
Если я правильно вас понял, что если
arr = [{id: 1}, {id: 2}, {id: 3}]; ? Как вариант можно сделать map var arr = [{id: 1}, {id: 2}, {id: 3}]; arr = arr.map(function(item){item.toString = function(){return this.id}; return item}); console.log(arr[arr.join(',').indexOf('2')-1]); |
[div, div, div]
|
Условие задачи другое.
Но в вашем случае не вижу проблемы, все тоже самое |
Часовой пояс GMT +3, время: 11:01. |