2016-10-14 3 views
1

Я недавно читал о Functional Programming и Immutable Objects в Javascript. Каков способ функционального программирования использования метода map?Функциональное программирование для Array.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}] 

Но это, кажется, нарушает правила функционального porgramming и неизменности обратный вызов будет изменять непосредственно элементы массива. Является ли следующий «правильный» способ сделать это?

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}] 

Или я просто переоцениваю это? Fiddle - here.

+0

'Но это, кажется, нарушает правила функционального porgramming и неизменности. 'Как? поскольку 'map' не будет изменять существующий массив, он вернет новый. – gurvinder372

+1

@ gurvinder372 сама карта не изменится, но -> 'el.a = el.a * 2' будет. – Keith

+0

вы должны сделать так: 'var arr2 = arr1.map (el => el * 2);' – Redu

ответ

2

Вы можете использовать pure function, который не мутирует входной объект, простым возвратом чего-то и не присваивая что-либо элементу данных.

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);

+0

Я полагаю, что он должен вернуться к элементу объекты с удвоенными свойствами. – Redu

+1

Я думаю, что ОП делал здесь несколько смущение, поскольку он сказал, что результаты были «// arr1 => [2, 4, 6]», когда на самом деле там '[{a: 2}, {a: 4} {a: 6}] ', простое изменение, конечно, просто завершение в новом объектном литерале. – Keith

+0

немного неясно, но для изменения значений внутри объектов массива я бы взял forEach, а не сопоставлял и присваивал новое значение in situ. –

3

Вам нужно будет использовать чистую функцию, которая не мутировать свои аргументы. Так что если вы хотите объекты с удвоенными значениями, вы должны создать новые объекты:

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);

1

задание будет Уничтожение того, сделать это очень приятно. В любом случае, вы должны создать новый объект, иначе объекты в 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}]

Смежные вопросы