簡體   English   中英

Array.map()的函數式編程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM