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

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

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

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

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

Ответы [ 31 ]

3 голосов
/ 08 апреля 2014

Пока браузер поддерживает ECMA-262 , 5-е издание (декабрь 2009 г.), это должно работать, почти в одну строку:

var bFound = myArray.some(function (obj) {
    return obj.id === 45;
});
3 голосов
/ 26 октября 2014

Вы можете сделать это даже в чистом JavaScript, используя встроенную функцию «фильтра» для массивов:

Array.prototype.filterObjects = function(key, value) {
    return this.filter(function(x) { return x[key] === value; })
}

Так что теперь просто передайте "id" вместо key и "45" вместо value, и вы получите полный объект, совпадающий с идентификатором 45. Так что это будет,

myArr.filterObjects("id", "45");
2 голосов
/ 19 ноября 2014

Мне очень понравился ответ, предоставленный Аароном Дигуллой, но мне нужно было сохранить мой массив объектов, чтобы я мог повторить его позже.Поэтому я изменил его на

	var indexer = {};
	for (var i = 0; i < array.length; i++) {
	    indexer[array[i].id] = parseInt(i);
	}
	
	//Then you can access object properties in your array using 
	array[indexer[id]].property
1 голос
/ 22 октября 2014

Это решение также может быть полезным:

Array.prototype.grep = function (key, value) {
    var that = this, ret = [];
    this.forEach(function (elem, index) {
        if (elem[key] === value) {
            ret.push(that[index]);
        }
    });
    return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");

Я сделал это так же, как $.grep, и если обнаружен один объект, функция вернет объект, а немассив.

1 голос
/ 28 февраля 2013

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

var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {

        if (obj.id === '5') { // id.toString() if it is int

            retObj = obj;
            return false;
        }
    });
return retObj;

Должен возвращать объект по идентификатору.

0 голосов
/ 25 сентября 2018

Мы можем использовать методы Jquery $ .each () / $. Grep () var data= []; $.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}

или

var data = $.grep(array, function( n, i ) { return ( n !== 5 && i > 4 ); });

использовать синтаксис ES6: Array.find, Array.filter, Array.forEach, Array.map

Или используйте Lodash https://lodash.com/docs/4.17.10#filter, Подчеркните https://underscorejs.org/#filter

0 голосов
/ 24 мая 2016

Мой способ найти индекс массива:

index = myArray.map((i) => i.id).indexOf(value_of_id);
item = myArray[index];
0 голосов
/ 09 сентября 2011

Используйте метод фильтра jQuery:

 $(myArray).filter(function()
 {
     return this.id == desiredId;
 }).first();

, который вернет первый элемент с указанным Id.

Он также имеет приятный формат C # LINQ.

0 голосов
/ 02 сентября 2014

Начиная с ответа Аггатона , эта функция на самом деле возвращает искомый элемент (или null, если не найден), учитывая функции array и callback, которые возвращают истинное значение для «правильного» элемента:

function findElement(array, callback) {
    var elem;
    return array.some(function(e) {
        if (callback(e)) {
            elem = e;
            return true;
        }
    }) ? elem : null;
});

Просто помните, что это не работает на IE8-, так как не поддерживает some. Может быть предоставлен polyfill, в качестве альтернативы всегда есть классический цикл for:

function findElement(array, callback) {
    for (var i = 0; i < array.length; i++)
        if (callback(array[i])) return array[i];
    return null;
});

Это на самом деле быстрее и компактнее. Но если вы не хотите изобретать велосипед, я предлагаю использовать служебную библиотеку, например, подчеркивание или lodash.

0 голосов
/ 04 марта 2015

Считать "axesOptions" массивом объектов с форматом объекта {: field_type => 2,: fields => [1,3,4]}

function getFieldOptions(axesOptions,choice){
  var fields=[]
  axesOptions.each(function(item){
    if(item.field_type == choice)
        fields= hashToArray(item.fields)
  });
  return fields;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...