Какой подход лучше всего искать объект в массиве?
Я отсортировал следующие способы поиска объекта в массиве. Этот вопрос задавался бесчисленное количество раз, но я хочу знать, какой из лучших из следующих способов. Если есть еще кто-то, я бы тоже хотел это знать.
С помощью$.grep()
function is_in_array(arr,element){
var result = $.grep(arr, function(e){ return e.id == element; });
return result.length;
}
Выше функция возвращает длину массива.
- 0 когда элемент отсутствует
- 1 когда элемент присутствует
- длина> 1, если присутствует больше элементов с одинаковым значением
используя объект поиска
var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
lookup[array[i].id] = array[i];
}
Таким образом, мне не нужно каждый раз проходить весь массив. Я бы просто проверил lookup[id]
вместо.
для цикла традиционным способом
function in_array(array, id) {
for(var i=0;i<array.length;i++) {
if(array[i].id === id) {
return true;
}
}
return false;
}
чтобы проверить, существует ли элемент, я бы позвонил in_array(arr,element)
,
Какой подход лучше? Вопрос серьезно звучит дублирующе, и это так, но я просто хочу убедиться, что лучше всего из этих трех.
Обновить
Массив будет содержать такие объекты, как -
var arr = [];
var nameObj = {};
nameObj.label = "somename";
nameObj.id = 123;
arr.push(nameObj);
.
.
.
2 ответа
Вы также можете использовать комбинацию JSON
(для сравнения) и Array.filter
метод:
var findvalue = JSON.stringify([somevalue]),
,found = [array].filter(
function(a){return JSON.stringify(a) === findvalue;}).length
;
// found > 0 means: findvalue found
Пример jsfiddle
Больше о Array.filter
и прокладка для старых браузеров @MDN
Вы можете использовать встроенный метод map() вместо цикла:
var lookup=array.map(function(e){return e.id;});
(Не поддерживается в IE 8)