Найти объект по идентификатору в массиве объектов JavaScript - PullRequest
1343 голосов
/ 09 сентября 2011

У меня есть массив:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

Я не могу изменить структуру массива. Мне передают идентификатор 45, и я хочу получить 'bar' для этого объекта в массиве.

Как мне сделать это в JavaScript или с помощью jQuery?

Ответы [ 31 ]

13 голосов
/ 13 сентября 2013

Вы можете использовать фильтры,

  function getById(id, myArray) {
    return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })[0]
  }

get_my_obj = getById(73, myArray);
11 голосов
/ 23 марта 2016

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

В реальном мире, если вы обрабатываете много элементов, а производительность вызывает беспокойство, гораздо быстрее изначально создать поиск:

var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var lookup = items.reduce((o,i)=>o[i.id]=o,{});

затем вы можете получить предметы в определенное время следующим образом:

var bar = o[id];

Вы можете также рассмотреть возможность использования карты вместо объекта в качестве поиска: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map

10 голосов
/ 04 июня 2015

Использование нативного Array.reduce

var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
    return (a.id==id && a) || (b.id == id && b)
});

возвращает элемент объекта, если найден, в противном случае false

6 голосов
/ 28 февраля 2015

Вот как мне поступить в чистом JavaScript, самым минимальным образом, который я могу себе представить, работает в ECMAScript 3 или более поздней версии. Возвращается, как только найдено совпадение.

var getKeyValueById = function(array, key, id) {
    var testArray = array.slice(), test;
    while(test = testArray.pop()) {
        if (test.id === id) {
            return test[key];
        }
    }
    // return undefined if no matching id is found in array
    return;
}

var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');

// result is 'bar', obtained from object with id of '45'
6 голосов
/ 08 августа 2017

Если вы делаете это несколько раз, вы можете настроить карту (ES6):

const map = new Map( myArray.map(el => [el.id, el]) );

Тогда вы можете просто сделать:

map.get(27).foo
4 голосов
/ 23 октября 2014

Опираясь на принятый ответ:

JQuery:

var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)

Или CoffeeScript:

foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo
4 голосов
/ 06 ноября 2012

Вы можете попробовать Sugarjs от http://sugarjs.com/.

У него очень приятный метод для массивов, .find. Таким образом, вы можете найти такой элемент:

array.find( {id: 75} );

Вы также можете передать объект с дополнительными свойствами, чтобы добавить еще одно "where-предложение".

Обратите внимание, что Sugarjs расширяет нативные объекты, и некоторые люди считают это очень злым ...

4 голосов
/ 12 декабря 2018

Более общий и короткий

function findFromArray(array,key,value) {
        return array.filter(function (element) {
            return element[key] == value;
        }).shift();
}

в вашем случае.var element = findFromArray(myArray,'id',45), что даст вам весь элемент.

3 голосов
/ 02 мая 2017

Используйте функцию Array.prototype.filter().

DEMO : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/

1010 * JSON *

var jsonObj =[
 {
  "name": "Me",
  "info": {
   "age": "15",
   "favColor": "Green",
   "pets": true
  }
 },
 {
  "name": "Alex",
  "info": {
   "age": "16",
   "favColor": "orange",
   "pets": false
  }
 },
{
  "name": "Kyle",
  "info": {
   "age": "15",
   "favColor": "Blue",
   "pets": false
  }
 }
];

FILTER

var getPerson = function(name){
    return jsonObj.filter(function(obj) {
      return obj.name === name;
    });
}
3 голосов
/ 09 сентября 2011

Итерация по любому элементу в массиве.Для каждого элемента, который вы посещаете, проверьте идентификатор этого элемента.Если это совпадение, верните его.

Если вы просто хотите использовать код:

function getId(array, id) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (array[i].id === id) {
            return array[i];
        }
    }
    return null; // Nothing found
}

И то же самое, используя методы массива ECMAScript 5:

function getId(array, id) {
    var obj = array.filter(function (val) {
        return val.id === id;
    });

    // Filter returns an array, and we just want the matching item.
    return obj[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...