[英]Functional programming for Array.map()
我最近在閱讀有關Java 語言中的函數式編程和不可變對象的信息。 使用map方法的功能編程方式是什么?
假設我想將數組中的值加倍。 我可以:
var arr1 = [{a: 1}, {a: 2}, {a: 3}];
arr1.map(function(el){
el.a = el.a*2;
return el;
});
// arr1 => [{a: 2}, {a: 4}, {a: 6}]
但這似乎違反了功能編程和不變性的規則,回調將直接修改數組的元素。 以下是執行此操作的“正確”方法嗎?
var arr1 = [{a: 1}, {a: 2}, {a: 3}];
var arr2 = angular.copy(arr1);
var arr2 = angular.copy(arr1).map(function(el){
el.a = el.a*2;
return el;
});
arr1 = arr2;
// arr1 => [{a: 2}, {a: 4}, {a: 6}]
還是我只是在想這個? 小提琴在這里 。
您將需要使用不改變其參數的純函數。 因此,如果您希望對象具有雙倍的值,則必須創建新的對象:
var arr1 = [{a: 1}, {a: 2}, {a: 3}]; console.log(arr1); var arr2 = arr1.map(function(el) { return {a: el.a*2}; }); console.log(arr2);
您可以使用不改變輸入對象的純函數 ,只需簡單地返回某些內容而不將某些內容分配給數據元素即可。
var arr1 = [{a: 1}, {a: 2}, {a: 3}], arr2 = arr1.map(function (el) { return el.a * 2; }); console.log(arr2); console.log(arr1);
返回帶有新對象的數組
var arr1 = [{a: 1}, {a: 2}, {a: 3}], arr2 = arr1.map(function (el) { return { a: el.a * 2 }; }); console.log(arr2); console.log(arr1);
銷毀分配將使其變得非常漂亮。 無論哪種方式,您都必須創建一個新對象,否則將修改arr1中的對象。
let arr1 = [{a: 1}, {a: 2}, {a: 3}]; let arr2 = arr1.map(({a}) => ({a: a * 2})) console.log(arr1); // [{a: 1}, {a: 2}, {a: 3}] console.log(arr2); // [{a: 2}, {a: 4}, {a: 6}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.