У меня вопрос относительно стрелочных функций в Javascript: что именно делает код внутри метода map()
? Я не могу понять, как именно это берет каждое слово, а затем метод join()
берет первый символ?!
const animals = ['Hen', 'elephant', 'llama', 'leopard', 'ostrich', 'Whale', 'octopus', 'rabbit', 'lion', 'dog'];
const secretMessage = animals.map(animal => animal[0]);
console.info(secretMessage.join(''));
Я думаю, вы понимаете, что делает карта, но вас смущает animal[0]
...
Точно! Я не могу понять, почему мы используем => и какова его конкретная цель.
animals.map(animal => animal[0])
; создает массив, содержащий первую букву каждого элемента. .map()
создает новый массив, перебирает с помощью функции
animal => animal[0]
, сопоставляет каждый элемент нового массива с первой буквой элемента массива животных (соответственно). Простые термины - функция внутри .map() является функцией итератора
secretMessage.join('')
— создает строку, соединяя каждый элемент массива с разделителем ''
Ваша функция карты на каждой итерации берет следующий элемент массива (животное) и возвращает первую букву текущего животного.
Вы можете представить это таким образом. Задача функции состоит в том, чтобы перебрать заданный вами массив При каждом новом вызове в стрелочную функцию передается следующий элемент массива. С ним можно делать любые операции и возвращать результат. Результат, возвращаемый стрелочной функцией, будет записан в текущий элемент массива NEW.
Для более простого понимания вы можете заменить функцию стрелки на эту
(animal) => {
return animal[0]
}
В результате вы получите массив, каждый элемент которого будет состоять из одной буквы (в данном случае первой)
join('')
объединяет все элементы массива в строку. Здесь передается ee - этим и будут заполняться промежутки между элементами, в данном случае это пустая строка и получится непрерывная строка
Если вы пройдете ' '
, вы получите что-то вроде H e l l o W o r l d
What exactly is the code inside the map() method doing?
.map()
— это операция, вызываемая для массива, которая будет выполнять предоставленную функцию для каждого элемента массива и возвращать новый массив, состоящий из значений, возвращаемых этой функцией.
Итак, это вызывает функцию для каждого элемента массива animals
:
animals.map(/.../)
И какая функция вызывается для каждого элемента массива animals
? Этот:
animal => animal[0]
Что, во всех смыслах и целях, по существу таково:
function (animal) {
return animal[0];
}
Аргумент, полученный функцией, является элементом массива, для которого она вызывается. В этом случае каждый элемент массива animals
является строкой, поэтому animal
является строкой.
И функция возвращает первую букву этой строки.
Итак, это:
animals.map(animal => animal[0]);
Ожидает массив строк и возвращает массив первых букв каждой строки.
Array.map создает новый массив и для каждого элемента в целевом массиве (тот, для которого вы используете функцию карты), использует функцию (тот, который вы ей дали, animal => animal[0]
), затем помещает любое значение, которое возвращает функция.
Что касается того, как, давайте рассмотрим императивный подход (поскольку вы хотите знать как)
//just for the example I'm overwriting the Array.map function
Array.prototype.map=function(yourCallback){
let yourArray=this, resultArray=[]
for(let i=0;i<yourArray.length;i++){
resultArray[i]=yourCallback(yourArray[i],i,yourArray)
//this line above is the relation between your callback and the returned result
}
return resultArray
}
const animals = ['Hen', 'elephant', 'llama', 'leopard', 'ostrich', 'Whale', 'octopus', 'rabbit', 'lion', 'dog'];
const secretMessage = animals.map(animal => animal[0]); //in this instance of arrow function, animal[0] IS what is returned
console.info(secretMessage.join(''));
Я думаю, вы понимаете, что делает карта, но вас смущает animal[0]
для каждой итерации цикла карты animal
— это string
, хранящийся в текущем элементе animals
array
. [0]
— это сокращенная ссылка на первый символ строки в этом элементе.
string[0]
идентично string.charAt(0)
Таким образом, ваша карта просто возвращает новый массив, содержащий первую букву каждого элемента исходного массива, который затем объединяется для создания секретного слова.
let string = "hello";
console.info(string[0]);
console.info(string.charAt(0));
console.info(string[0]===string.charAt(0));
Это был ответ, который я искал! Я просто не мог понять, как это возможно? Я имею в виду, когда я имел дело с animal[0], я знал, что он принимает первую строку/значение массива, но как я должен был знать, что это именно жизнь charAt? Спасибо за помощь!
const animals
— это массив строк, и вы можете получить доступ к отдельным буквам каждой строки так же, как вы можете получить доступ к отдельным элементам массива:
Первый элемент массива animals[0]
— «курица».
animals.map()
выполняет итерацию по каждому элементу массива, поэтому мы назвали каждый элемент в массиве «животным», мы могли бы назвать его как угодно, но мы сказали animals.map(animal => animal[0])
, поэтому animal[0]
— это первая буква каждой записи.
Если стрелочная функция имеет только одну строку, вам не нужно включать оператор return
или фигурные скобки, она просто вернет результат, в нашем случае первую букву каждого животного. Затем он помещается в наш новый массив secretMessage
как отдельный строковый элемент. Затем мы используем метод массива join()
, чтобы сшить вместе те отдельные строки, которые содержит массив.
Вот хороший инструмент, который помогает визуализировать это: Репетитор по Python
Array.map создает новый массив и для каждого элемента в целевом массиве (тот, для которого вы используете функцию карты), использует функцию (тот, который вы ей дали,
animal => animal[0]
), затем помещает любое значение, которое возвращает функция.