Методы функционального массива в JavaScript (map(), reduce(), filter(), etc
) все возвращают новые объекты. Ни одна из них не работает напрямую с массивом, для которого вызывается метод.
Однако объекты в JavaScript передаются по ссылке. И map()
(и другие методы) создают только поверхностную копию массива, к которому они обращаются. Поэтому, если этот массив состоит из объектов, то копия массива, используемая map()
, содержит ссылки на те же объекты.
Пример быстрого кода демонстрирует это.
const foo = ['a', 'b'];
foo.map(itm => {
itm = 'c';
return itm;
}
console.dir(foo) // still ['a', 'b']
const bar = [{id: 'a'}, {id: 'b'}];
bar.map(itm => {
itm.id = 'c';
return itm;
}
console.dir(bar) // the referenced objects were updated [{id: 'c'}, {id: 'c'}]
Второй пример использует map()
для создания побочного эффекта , который в целом противоречит идее функционального программирования. И ваш коллега делает то же самое со своими звонками на orders.map()
. Его / ее внутренняя функция преобразовывает свойства отдельных объектов заказов, которые хранятся и на которые ссылается массив клонированных заказов. Использование map()
без присвоения его возвращаемого значения является запахом кода для большинства JavaScript программистов.
Вместо этого код должен использовать array.forEach () , который равен предназначен для побочных эффектов и не имеет возвращаемого значения. Синтаксис forEach()
почти идентичен map()
, и его можно использовать в качестве замены в приведенном выше примере.