2017-02-22 5 views
2

を割り当てる使用してプロパティを追加する私は、次の機能を持っている:は、オブジェクトが

addHrefs = (list) => { 
    const listWithHrefs = list.map((item) => { 
     item.href = customFunction(item.name); 
     return item; 
    }); 
    return listWithHrefs; 
} 

ここでの問題は、私はlistオブジェクトを変異しています。私はlistを変異させずに特定の(key, value)ペアを追加する方法を知りたいと思います。 Object.assignで可能ですか?どうしたらいいですか?

答えて

3

Object.assignで可能です。

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

プロパティ値を新しいオブジェクトに割り当てて戻すことができます。

addHrefs = list => 
    list.map(item => Objects.assign({}, item, { href: customFunction(item.name) })); 
+0

お知らせを返すが、それでも突然変異を使用しています。 – Bergi

+0

@Nina Scholzそれは働いた。しかし、なぜ 'list'が突然変異したのか理解できません(私は' Object.assign'を使って作業しなければならなかったと思います)。私はjavascriptコンソールで 'map'関数を試してみましたが、リストオブジェクト' b = a.map(function(i){return i * 2}) 'と' JSON.stringify(a)=== JSON.stringify(b) 'は間違っていたので、ES6の振る舞いだと思いますが、もしそうなら、なぜリストが突然変異したのか説明できますか? – FacundoGFlores

+1

'item'はオブジェクトへの参照であるため、' item'が変更されているので、 'list'を変更します。あなたの例ではオブジェクトは変更されません。 –

1

2番目のパラメータで、Object.assign()に最初のパラメータとして参照されたオブジェクトをプレーンなオブジェクトを渡すことができます。 Object.assign()に割り当てられた変数の操作を実行し、これは `list`を変異させていない可能性があることを、変数

let list = [{ 
 
    a: 1 
 
}, { 
 
    a: 2 
 
}, { 
 
    a: 3 
 
}]; 
 

 
let res = list.map(item => { 
 
    let o = Object.assign({}, item); 
 
    // do stuff with `o` 
 
    o.a = o.a + 10; 
 
    // return `o` 
 
    return o 
 
}); 
 

 
console.log(list, res);

関連する問題