#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