2016-07-15 2 views
-2

Моя попыткаПонимание нахождения объекта в массиве

Привет, так что мы можем сделать что-то вроде

var myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'ye'}]; 
    function getById(id, myArray) { 
    return myArray.filter(function(obj) { 
     if(obj.id == id) { 
     return obj 
     } 
    }) 
    } 

    get_my_obj = getById(45, myArray); 
    console.log(get_my_obj); 

Чтобы отфильтровать наш объект. Однако после некоторого тестирования я понял, что я не получаю нужный мне результат, я заметил, что если я добавляю [0] как таковой

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

Проблема

Это отлично работает. Зачем мне нужен [0]?

+1

'filter' отдача массив соответствующих элементов. [читать документы] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) –

ответ

4

Array.prototype.filterфильтры массив; он удаляет элементы из массива, которые не соответствуют вашему предикату. В результате получается массив, предположительно короче того, с которого вы начали.

Что вы ищете, это Array.prototype.find, который возвращает только .

+0

[0] указывает на {'id': '73', ' foo ':' bar '}, поэтому мне интересно, почему мой код работает, когда я ищу идентификатор 45, который находится в точке [1]. –

+0

Индексы фильтрованного массива не соответствуют исходным индексам. Возвращаются только значения в новом массиве, который непрерывно индексируется, начиная с '0'. – deceze

+0

Я вижу. так что происходит, когда мы не ставим [0], за кулисами? его все еще записывает что-то [Object] –

0

Предположим, что ваш результат был таков:

[{'id':'73','foo':'bar'}] 

Это массив с только один объект внутри. Но, используя индекс ([0]), вы получаете первый элемент внутри массива (который имеет только один). В этом случае объект:

{'id':'73','foo':'bar'} 
+0

Но если я попытаюсь найти идентификатор 45, это также работает, и это в [1] массива. –

+0

Не возвращенный массив. –

+0

Я в замешательстве. Что я спрашиваю, почему я получаю желаемый результат, если я ищу идентификатор 45. Как вы говорите [0] указывает на объект с id 73 –

2

Массивный фильтр возвращает массив. Этот массив состоит из каждой строки исходного массива, для которой функция фильтра возвращает true.

Даже если массив имеет только одну запись, это еще массив

перед:

[0]{'id':'73','foo':'bar'} 
[1]{'id':'45','foo':'ye'} 

после:

[0]{'id':'45','foo':'ye'} 

Думай другого примера

[0]{'id':'73','foo':'bar'} 
[1]{'id':'45','foo':'ye'} 
[2]{'id':'32','foo':'ye'} 
[3]{'id':'33','foo':'ye'} 
[4]{'id':'33','foo':'baz'} 

функция shoult фильтрует любую строку, которая имеет значение «ye» для foo

[0]{'id':'45','foo':'ye'} 
[1]{'id':'32','foo':'ye'} 
[2]{'id':'33','foo':'ye'} 

Вы видите. В обоих случаях возвращаемое значение представляет собой массив совпадающих объектов. Было бы неудобно, если бы мы вернули только один совпадающий объект, если получили только одно совпадение ({'id':'45','foo':'ye'}).

Сначала метод фильтра должен принять решение о возврате массива или объекта. Затем получатель возвращаемого значения должен проверить, является ли это значение массивом или объектом. Это было бы довольно странно.


фильтр() вызывает функцию обратного вызова при условии один раз для каждого элемента в массив, и формирует новый массив всех значений, для которых обратного вызова возвращает значение, которое принуждает к истине. обратный вызов вызывается только для индексов массива, которым присвоены значения; это не , вызываемый для индексов, которые были удалены или которые никогда не были присвоенных значений. Элементы массива, которые не проходят тест обратного вызова , просто пропущены и не включены в новый массив.

Жирный мной
От: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

+0

Хорошо, позвольте мне сказать, о чем я думаю. Предположим, что у нас нет [0]. тогда мы ищем наш идентификатор 73. Мы заходим в наш массив и фильтруем его. Сначала мы начинаем с myArray [0], если {'id': '73', 'foo': идентификатор 'bar'} (73) совпадает с тем, который мы ищем (что он), мы возвращаем это весь объект. Большой! Так почему [0] .. –

+0

Вы думаете, как бы вы запрограммировали его. Но вы должны взять то, что получаете. Удобнее всегда возвращать массив, чем возвращать один объект, если массив будет состоять только из этого объекта. – HerrSerker

1

Короче Array#filter возвращает массив с элементом, где обратный вызов возвращает true.

Если вы ожидаете только одного пункта, то лучше всего использовать Array#some и установить индекс.

function getById(id, myArray) { 
 
    var index = -1; 
 
    myArray.some(function (obj, i) { 
 
     if (obj.id == id) { 
 
      index = i; 
 
      return true; 
 
     } 
 
    }); 
 
    return myArray[index]; 
 
} 
 

 
var myArray = [{ 'id': '73', 'foo': 'bar' }, { 'id': '45', 'foo': 'ye' }], 
 
    get_my_obj = getById(45, myArray); 
 

 
console.log(get_my_obj);

+0

Неужели вы плохо переопределяете '.findIndex()' используя '.some' как итератор ...?! Нечетный выбор методов ... – deceze

+0

@deceze, что является лучшим решением без es6? –

+0

1) Возврат индекса, а затем использование индекса для доступа к элементу кажется странным для стартеров. 2) '.find' - это, пожалуй, лучший метод, и если вам все равно нужно полифонировать, полифонию' .find'. – deceze

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