Переход вашего текущего кода для работы эквивалентно с использованием Array.prototype.forEach()
вместо for
требует минимального изменения:
function CreateSuspectObjects (name) {
return {
name: name,
color: name.split(' ')[1],
speak() {
console.log(`My name is ${name}`);
}
};
}
let suspects = ['Miss Scarlet', 'Colonel Mustard', 'Mr. White'];
let suspectsList = [];
// Using forEach()
suspects.forEach((name, i, suspects) => {
// use name instead of suspects[i]
suspectsList.push(CreateSuspectObjects(name))
});
console.log(suspectsList);
Однако, поскольку вы создаете новый массив путем преобразования каждого объекта в существующий массив, вы должны использовать Array.prototype.map()
вместо:
function CreateSuspectObjects (name) {
return {
name, // short-hand for name: name
color: name.split(' ')[1],
speak() {
console.log(`My name is ${name}`);
}
};
}
const suspects = ['Miss Scarlet', 'Colonel Mustard', 'Mr. White'];
// Using map()
const suspectsList = suspects.map(name => {
return CreateSuspectObjects(name);
});
console.log(suspectsList);
Вы можете сжать это еще больше, поскольку name => { return CreateSuspectObjects(name); }
делает точно то же самое, что и CreateSuspectObjects
, изменяя выражение на
const suspectsList = suspects.map(CreateSuspectObjects);
array.forEach()
против array.map()
Причина, по которой suspects.forEach(CreateSuspectObjects);
не работал, связана с разницей между forEach()
и map()
. forEach()
перебирает каждое значение в suspects
и выполняет функцию, предусмотренную для его побочного эффекта . В моем первом фрагменте побочным эффектом является suspectsList.push()
, который добавляет значение к существующему массиву suspectsList
.
Однако, CreateSuspectObjects()
не имеет побочных эффектов; он просто возвращает объект, который forEach()
будет игнорировать, поскольку возвращаемое значение функции не используется.
Причина, по которой suspects.map(CreateSuspectObjects);
сработал, состоит в том, что map()
создает массив того же размера, что и suspects
, и перебирает каждое значение в suspects
, чтобы выполнить функцию, предусмотренную для его возвращаемого значения . map()
использует возвращаемое значение функции в качестве инициализатора для каждого соответствующего значения в массиве, который она создала, а затем возвращает его.