12.08.2014, 20:36
|
Аспирант
|
|
Регистрация: 06.08.2014
Сообщений: 58
|
|
Поиск по массиву объектов
Есть массив объектов. Я знаю ключ к нужному объекту(key=137),но не знаю который это объект в массиве(нужно раза 3 прочитать чтобы понять суть). Можно запустить перебор всего массива,но это долго(это для всплывающего окна пользователя). Иначе окно будет всплывать вечность. Как выбрать объект из массива, зная его ключ. Скрин прилагается:
|
|
12.08.2014, 20:44
|
|
Профессор
|
|
Регистрация: 17.01.2013
Сообщений: 887
|
|
key это значение свойства объекта, он к массиву слабо относится
думаю придётся все перебирать
|
|
12.08.2014, 20:47
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
ну если массив упорядоченный по номеру то очень просто)
Даже если key не соответсвует номеру массива в упорядоченном массиве можно использовать алгоритм бинарного поиска
Можете упорядочить массив и будет вам счастье.
Упорядочевать массив врятли придется часто, так что там тормоза не критичны
|
|
12.08.2014, 20:56
|
Профессор
|
|
Регистрация: 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.
|
|
13.08.2014, 17:54
|
Лаборант :-)
|
|
Регистрация: 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));
|
|
13.08.2014, 18:32
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,585
|
|
Pavel M., мечтай.)
__________________
29375, 35
|
|
13.08.2014, 20:49
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Pavel M.,
Если уж нужен 1 элемент и использовать нативные методы то надо пользовать some, потому что его можно остановить найдя нужный элемент, а filter пройдет весь массив целиком.
|
|
13.08.2014, 21:01
|
|
Тлен
|
|
Регистрация: 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
|
|
13.08.2014, 21:02
|
Профессор
|
|
Регистрация: 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.
|
|
14.08.2014, 01:45
|
|
junior
|
|
Регистрация: 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>
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|