2011-02-04 3 views
4

У меня есть массив как это:Javascript найти в массиве

var movies = [ 
    { Name: "The Red Violin", ReleaseYear: "1998", Director: "François Girard" }, 
    { Name: "Eyes Wide Shut", ReleaseYear: "1999", Director: "Stanley Kubrick" }, 
    { Name: "The Inheritance", ReleaseYear: "1976", Director: "Mauro Bolognini" } 
    ]; 

Я хочу найти местоположение фильма, который вышел в 1999 году

Если вернуться 1.

Что является самым простым способом?

Спасибо.

ответ

6

Вам придется перебирать каждое значение и проверять.

for(var i = 0; i < movies.length; i++) { 
    if (movies[i].ReleaseYear === "1999") { 
     // i is the index 
    } 
} 

Поскольку JavaScript недавно была добавлена ​​поддержка наиболее распространенных collection operations и это явно работа фильтра на коллекции, вместо того, чтобы вы могли бы также сделать:

var moviesReleasedIn1999 = movies.filter(function(movie) { 
    return movie.ReleaseYear == "1999"; 
}); 

при условии, что вы не заинтересованы в индексах а фактические объекты данных. Большинство людей не в любом случае :)

.filter не поддерживается во всех браузерах, но вы можете добавить ее самостоятельно на свой код базы: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter#Compatibility

+0

если вам нужно только, чтобы получить один фильм затем добавить 'перерыв,' в конце, перед закрытием 'if'. PS: Отличный аватар! – JCOC611

+1

Одно быстрое примечание. Вы захотите выйти из этого цикла после выполнения условия. Может сделать «return i;» – Adrian

+0

Да, или 'return i;' если это функция. (в дополнение к моему предыдущему комментарию) – JCOC611

2

Что-то вроде:

function findMovieIndices(movies, prop, value) { 
    var result = []; 
    for(var i = movies.length; i--;) { 
     if(movies[i][prop] === value) { 
      result.push(i); // personally I would return the movie objects 
     } 
    } 
    return result; 
} 

Использование:

var indices = findMovieIndices(movies, "ReleaseYear", "1999"); 

Возможно, это дает вам представление о более обобщенной функции (если вам это нужно).

+0

+1 - лично я бы тоже возвратил объект фильма :) – Anurag

+0

+1, но diff usecases. например, jquery $ .inArray также возвращает ключ. – Mark

0

Вам нужно будет создать свою собственную функцию поиска.

Array.prototype.findMovieByYear = function (findYear) { 

    for (var i = 0; i < this.length; i++) { 
     // this actually returns the element, maybe you just want 
     // to return the array index (the i param) 
     if (this[i].Release == findYear) return this[i]; 
    } 

    return null; 
    // or return -1 or whatever if you want to return the index 

}; 

// now you can call: 
movies.findMovieByYear('1998'); 
// and that should return 
{ Name: "The Red Violin", ReleaseYear: "1998", Director: "François Girard" } 

Конечно, это способ сделать это на самом деле влияет на каждый массив вы создаете .. что может быть не то, что вы хотите .. Вы можете создать свой собственный объект массива затем ...

+0

Не расширяйте собственные прототипы. Мы все знаем, что это плохая идея, потому что она разрушает «за» циклы и разрывает различные сторонние библиотеки. По крайней мере, возложите на него отказ. – Raynos

+0

@Raynos: Ну, вы все равно не должны использовать 'for ... in' для массивов;) Но да, я помню проблему с jQuery и расширенным прототипом' Object' или 'Array' ... –

+0

@FelixKling это не я что меня беспокоит столько же, сколько программисты и другие сторонние библиотеки/плагины. – Raynos

2

Поскольку вы» ве также помечать его с JQuery, вы можете использовать «карту» функцию:

var movies = $.map(movies,function(item,index){ 
    return item.ReleaseYear == 1999 ? index : null; 
}); 

Это возвращает массив индексов для всех фильмов с годом 1999. Если вы хотите кинофильмам себя как массив:

var movies = $.map(movies,function(item){ 
    return item.ReleaseYear == 1999 ? item : null; 
}); 
+0

@Raynos - используется функция отображения jQuery. Если возвращается что-либо, кроме «null» или «undefined», оно будет вставляться в результирующий массив. –

+0

мой оригинальный комментарий был неправильным, но решение не справляется с не найденным случаем, кроме возврата пустого массива. – Raynos

+0

@Raynos Пустой набор - мой способ обработки не найден :) –

1

Если функциональный стиль программирования применим:

_.indexOf(_.pluck(movies, "ReleaseYear"), "1999")

Потому что это так просто. Функциональный набор инструментов underscore.js может быть очень мощным.

_.indexOf, ._pluck