Я не понимаю, как метод every() знает, какие элементы он должен сравнивать. Есть какие-нибудь идеи?

#javascript #arrays #methods

Вопрос:

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

 const order = [['sunglasses', 1], ['bags', 2]];
 

… объект…

 const inventory = {
  sunglasses: 1900,
  pants: 1088,
  bags: 1344
};
 

…и следующий аргумент в теле функции:

 let inStock = order.every(item => inventory[item[0]] >= item[1]);
 

Я знаю, что функция every() была вызвана в порядке массива и вернет логическое значение на основе представленного условия (проще говоря, если в инвентаре достаточно предметов для выполнения заказа, она возвращает значение true, в противном случае она возвращает значение false). Проблема в том, что я не могу понять, как метод every() знает, с какими элементами следует сравнивать и что именно представляют индексы [0] и [1] в этой ситуации.

Комментарии:

1. Добавьте несколько консолей. журналы, чтобы увидеть, что происходит

2. Каждая итерация заказа передает [имя элемента, количество элементов] функции. имя элемента используется для поиска инвентаря, и количество элементов сравнивается с количеством запасов. Все они должны соответствовать друг другу, чтобы удовлетворить каждое

3. Спасибо, теперь я все понял!

Ответ №1:

В обратном вызове , предоставленном для every , первым аргументом является повторяемый элемент, и обратный вызов вызывается для каждого элемента в массиве до тех пор, пока один из обратных вызовов не вернет что-то неверное или пока массив не будет исчерпан.

Вы могли бы реализовать это самостоятельно вот так:

 Array.prototype.myEvery = function(callback) {
  for (const element of this) {
    const result = callback(element);
    if (!result) return false;
  }
  return true;
}
 

Так что здесь

 .every(item => inventory[item[0]] >= item[1]);
 

item является одним из элементов массива, по которому выполняется итерация — например ['sunglasses', 1] , или ['bags', 2] . Затем скобочная нотация извлекает значение из подмассива, и оно становится чем-то вроде

 inventory['sunglasses'] >= 1
 

или

 inventory['bags'] >= 2
 

с возвращением результата. Если все обратные вызовы возвращают истинное значение, результатом .every вызова является true .

Комментарии:

1. Я думаю, что это объяснение труднее понять, чем просто сказать оператору, что inventory это таблица поиска, item[0] это имя элемента, переданного каждому, и item[1] это количество элементов в заказе

2. Спасибо, теперь я все понял!

3. Обозначение скобок @CassioFortunato позволяет получить доступ к свойству объекта на основе значения в переменной. Например const foo = 'prop'; const obj = { prop: 'val' } , затем obj[foo] оценят, чтобы val . В вашем коде item[0] вычисляется первый элемент в подмассиве — например 'sunglasses' , или 'bags' , который затем можно использовать для поиска значения inventory объекта.

4. Спасибо, это именно та часть, с которой я боролся больше всего. Я продолжал думать о том, что «элемент» в итерации является первым элементом каждого массива порядка, а не всего массива. Мне удалось понять это после того, как я очень сильно сжал свой мозг, ха-ха. Еще раз большое вам спасибо за поддержку.

5. Еще раз спасибо вам за отзыв @CertainPerformance. Я новичок во всем этом.

Ответ №2:

Простое объяснение

Инвентарь-это таблица поиска, товар[0] — это название товара, переданного каждому, а товар[1] — количество товаров в заказе

Каждая итерация заказа передает [имя элемента, количество элементов] функции. имя элемента используется для поиска инвентаря, и количество элементов сравнивается с количеством запасов. Все они должны совпадать, чтобы удовлетворить every