2013-12-17 4 views
1

(Во-первых, я читал вопросы и ответы здесь в течение длительного времени, но это мой первый пост.)Поиск индекса элемента массива в массиве объектов в JavaScript?

Я нашел решения, которые включают в себя запись вашей собственной функции для этого, но я должен верить есть встроенный способ сделать это.

Я работаю в JavaScript и есть массив пользовательских объектов, каждый из которых выглядит следующим образом:

{ prop1: "1", prop2: "blah", prop3: "news", prop4: "2", prop5: "1" } 
{ prop1: "2", prop2: "foo", prop3: "news", prop4: "2", prop5: "1" } 
{ prop1: "3", prop2: "bar", prop3: "news", prop4: "2", prop5: "1" } 
{ prop1: "4", prop2: "hello", prop3: "news", prop4: "2", prop5: "1" } 

Я хочу найти встроенный способ найти индекс массива одного из объектов, учитывая значение одного из его свойств (для этого примера, если бы я дал ему «prop2» и «bar», он вернул бы индекс 2). Было бы неплохо использовать .indexOf, как и следовало ожидать, но, видимо, с массивом пользовательских объектов, это не работает.

Я нашел код для своей собственной функции, которая отлично работает, но в моем упрямстве я убежден, что для этого нужно только встроенный способ. В этом проекте я делаю много вещей в jQuery, так что это абсолютно вариант. Какие-либо предложения?

+0

Посмотрите на Backbone.js. Вы создаете модели для своей схемы данных и создаете коллекции из них, которые вы можете запросить. –

+0

Я не верю, что есть собственные средства для выполнения запросов JSON без написания вашей собственной функции (например, пример @ scrblnrd3) ​​или использования библиотеки. Этот вопрос задавался много раз разными способами. Примеры: http://stackoverflow.com/questions/8670345/trouble-using-indexof-on-a-complex-array и http://stackoverflow.com/questions/8668174/indexof-method-in-an-object- array –

+0

Также имейте в виду, что indexOf предназначен для использования в собственных типах JavaScript, а не для объектов/сложных типов. Технически индекс indexOf * работает так, как ожидалось. При всем моем уважении, я считаю, что ваши ожидания ошибочны. –

ответ

1

Вы можете расширить прототип собственного массива для этого, используя как property, так и value как строки. Здесь приведено JSFiddle, чтобы продемонстрировать, что

Array.prototype.indexOfAssociative=function(property,value){ 
    for(var i=0;i<this.length;i++){ 
      if(this[i][property]==value){ 
       return i; 
      } 

    } 
    return -1; 
}; 
+0

Правильно, это решение, которое я принял для этого, но я просто должен поверить, что есть встроенный способ сделать это. Наверное, я ошибаюсь. –

+0

Я не верю, что есть, но я не могу ошибаться – scrblnrd3

+0

Лучше не распространять собственные объекты, поскольку это нарушает инкапсуляцию: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide /Inheritance_and_the_prototype_chain?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FInheritance_and_the_prototype_chain#Bad_practice.3A_Extension_of_native_prototypes – HMR

Смежные вопросы