2

機能的な方法でのJavaScriptのプログラミングは大きな利点です。私はmap関数で渡されたオブジェクトである項目が変更できないことを意味する機能的な方法でオブジェクトの配列に含まれるオブジェクトのプロパティを変更しようとしています。私はこのような何かを行う場合は、次の項目は関数の内部で修正されているので機能的な方法でオブジェクトのプロパティを変更します

const modObjects = objects.map((item) => { 

    item.foo = "foo" + 3; 

    return item; 
}); 

これは機能しません。あなたはこの問題に対する他のアプローチを知っていますか?

+0

あなたは、元のオブジェクトを変異されています。地図が間違った方法です。 –

+0

'item'のコピーを作成し、プロパティを変更してコピーを返します。 – thefourtheye

答えて

1

Object.assignを使用して、アイテムobjのコピーを作成し、マップコールバックから返すことができます。

Object.assign()

Object.assign()メソッドは、ターゲット・オブジェクトに1つ以上のソースオブジェクトからすべての列挙独自のプロパティの値をコピーするために使用されます。ターゲットオブジェクトを返します。

ここでは、上記anwserが近くであるが、これは機能

const data = [ 
    {"foo": "one"}, 
    {"foo2": "two"}, 
    {"foo3": "three"} 
] 

const newData = data.map(item => 
    Object.assign(item, { 
    otherFoo: 'bar', 
    }) 
) 

console.log(data) 
console.log(newData) 
+0

'data'に変更可能なオブジェクトへの参照がある場合、' newData'の参照透過性が壊れます。 – etherealite

0

あります)方法はとなります。実際にはは不変です。関数型プログラミングの精神で:

const propValueSet = (prop) => (value) => (obj) => ({...obj, [prop]: value}) 
 
const data = [{"foo": "one"}, {"foo2": "two"}, {"foo3": "three"}]  
 
const newData = data.map(propValueSet('foo2')('bar')) 
 
console.log(data) // Should not change after mapping 
 
console.log(newData) // Each object should contain the new foo2

1

新しい(ES6追加特性へのより良い方法であろう例

let data = [ 
 
    {"foo": "one"}, 
 
    {"foo": "two"}, 
 
    {"foo": "three"} 
 
] 
 

 
let newData = data.map(item => { 
 
    let itemCopy = Object.assign({}, item); 
 
    itemCopy.foo = "foo " + item.foo; 
 
    return itemCopy; 
 
}) 
 

 
console.log(data) 
 
console.log(newData)

関連する問題