Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.08.2014, 20:36
Аспирант
Отправить личное сообщение для Georrg Посмотреть профиль Найти все сообщения от Georrg
 
Регистрация: 06.08.2014
Сообщений: 58

Поиск по массиву объектов
Есть массив объектов. Я знаю ключ к нужному объекту(key=137),но не знаю который это объект в массиве(нужно раза 3 прочитать чтобы понять суть). Можно запустить перебор всего массива,но это долго(это для всплывающего окна пользователя). Иначе окно будет всплывать вечность. Как выбрать объект из массива, зная его ключ. Скрин прилагается:
Ответить с цитированием
  #2 (permalink)  
Старый 12.08.2014, 20:44
Аватар для animhotep
Профессор
Отправить личное сообщение для animhotep Посмотреть профиль Найти все сообщения от animhotep
 
Регистрация: 17.01.2013
Сообщений: 887

key это значение свойства объекта, он к массиву слабо относится
думаю придётся все перебирать
Ответить с цитированием
  #3 (permalink)  
Старый 12.08.2014, 20:47
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

ну если массив упорядоченный по номеру то очень просто)

Даже если key не соответсвует номеру массива в упорядоченном массиве можно использовать алгоритм бинарного поиска

Можете упорядочить массив и будет вам счастье.

Упорядочевать массив врятли придется часто, так что там тормоза не критичны
Ответить с цитированием
  #4 (permalink)  
Старый 12.08.2014, 20:56
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Кстати если так нужно часто искать метку то почему бы не поменять формат? Сделать асоциативный массив по ключам. Или если не жалко память то можно сделать карту массива что обеспечит мгновенный поиск.

Карта массива:
var arr = [
  {
      key: 1,
      label: "trololo1" 
  },
  {
      key: 2,
      label: "trololo2" 
  }
];

var map = {
   1: 0,
   2: 1
};

alert(arr[map[1]].label);


Естественно что карта должна генерироваться налету, но идея должна быть понятна.

Последний раз редактировалось tsigel, 12.08.2014 в 21:01.
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2014, 17:54
Лаборант :-)
Отправить личное сообщение для Pavel M. Посмотреть профиль Найти все сообщения от Pavel M.
 
Регистрация: 08.11.2011
Сообщений: 806

может быть Array.prototype.filter
будет быстро искать?

var arr = [
  {key: 3, label: '333333333'},
  {key: 137, label: '555'},
  {key: 2, label: '222222'}
],
myArr = arr.filter(function (item) {
  return (item.key === 137);
});

alert(JSON.stringify(myArr));
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2014, 18:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Pavel M., мечтай.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2014, 20:49
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Pavel M.,
Если уж нужен 1 элемент и использовать нативные методы то надо пользовать some, потому что его можно остановить найдя нужный элемент, а filter пройдет весь массив целиком.
Ответить с цитированием
  #8 (permalink)  
Старый 13.08.2014, 21:01
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

tsigel, в ff есть ещё find :
var arr = [
  {key: 3, label: '333333333'},
  {key: 137, label: '555'},
  {key: 2, label: '222222'}
],
myArr = arr.find(el => el.key === 137);
 
alert(JSON.stringify(myArr));
но цикл всё равно быстрее.)
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 13.08.2014, 21:02
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Aetae,
Цикл for быстрее чем some?

то есть
var arr = [...];
var someKey = "somekey"

for (var i=0,l=arr.length;i<l;i++) {
   if (arr[i].key==someKey) {
      //...
      break;
   }
}


быстрее чем

var arr = [...];
var someKey = "somekey"


arr.some(function (el) {
   if (el.key==someKey) {
      //...
      return true;
   }
});


Вроде бы писали везде что эти нативные методы не уступают обычным переборам. Точнее я читал что они иногда даже быстрее, а иногда - медленнее, но не значительно.

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

<script src="http://sugarjs.com/release/current/sugar-full.min.js"></script>
<script>
var arr = [
  {key: 3, label: '333333333'},
  {key: 137, label: '555'},
  {key: 2, label: '222222'}
];

alert(JSON.stringify(arr.find({key: 137})));
</script>
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск объектов в массиве Lynatik Общие вопросы Javascript 24 22.06.2013 12:43
Профессиональный поиск по массиву RazZzeR Элементы интерфейса 14 10.06.2012 13:07
Поиск по многомерному массиву Ultimatum Общие вопросы Javascript 12 20.11.2011 14:53
поиск по массиву zebulun Общие вопросы Javascript 4 02.09.2011 02:09
Быстрый поиск объектов Shasoft Общие вопросы Javascript 7 30.07.2009 05:28