Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск по массиву объектов (https://javascript.ru/forum/misc/49427-poisk-po-massivu-obektov.html)

Georrg 12.08.2014 20:36

Поиск по массиву объектов
 
Есть массив объектов. Я знаю ключ к нужному объекту(key=137),но не знаю который это объект в массиве(нужно раза 3 прочитать чтобы понять суть). Можно запустить перебор всего массива,но это долго(это для всплывающего окна пользователя). Иначе окно будет всплывать вечность. Как выбрать объект из массива, зная его ключ. Скрин прилагается:

animhotep 12.08.2014 20:44

key это значение свойства объекта, он к массиву слабо относится
думаю придётся все перебирать

tsigel 12.08.2014 20:47

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

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

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

Упорядочевать массив врятли придется часто, так что там тормоза не критичны

tsigel 12.08.2014 20:56

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

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

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

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


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

Pavel M. 13.08.2014 17:54

может быть 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));

Aetae 13.08.2014 18:32

Pavel M., мечтай.)

tsigel 13.08.2014 20:49

Pavel M.,
Если уж нужен 1 элемент и использовать нативные методы то надо пользовать some, потому что его можно остановить найдя нужный элемент, а filter пройдет весь массив целиком.

Aetae 13.08.2014 21:01

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));
но цикл всё равно быстрее.)

tsigel 13.08.2014 21:02

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;
   }
});


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

nerv_ 14.08.2014 01:45

<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>


Часовой пояс GMT +3, время: 16:13.