Какой подход лучше всего искать объект в массиве?

Я отсортировал следующие способы поиска объекта в массиве. Этот вопрос задавался бесчисленное количество раз, но я хочу знать, какой из лучших из следующих способов. Если есть еще кто-то, я бы тоже хотел это знать.

С помощью$.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)

Другие вопросы по тегам