2017-03-25 10 views
1

私はこのようなデータ構造を持っている:私は、オブジェクトの内部配列上にマッピングしたいマッピング

let foo = [{ "a": [1,2,3] }] 

を、この配列内の

// Approach 1: 
foo.map(foo => foo.a.map(val => val + 1)) 

これは[ [ 2,3,4 ] ]を返しますが、外側のオブジェクトを削除します(これはかなり興味深いものです)。

// Approach 2: 
foo.map(foo => { 
    foo.a = foo.a.map(val => val + 1) 
    return foo 
}) 

これは機能しますが、オブジェクト自体も変更されます。

正しい値を返しますが、引数として与えられたオブジェクトは変更されません。

EDIT:

私のユースケースは、この配列内の複数のオブジェクトを持っています

let bar = [ 
    { "a": [1,2,3] }, 
    { "a": [5,5,5] }, 
    { "a": [10,100,1000] }, 
] 

だから、直接内部の配列を扱う本当に助けにはなりません。

+1

'FOO [0] .a.map(ヴァル=>ヴァル+ 1)' – adeneo

答えて

1

Object.assign()を使用して元のオブジェクトのコピーを返し、変更されたaアレイを追加できます。

let bar = [ 
 
    { "a": [1,2,3]}, 
 
    { "a": [5,5,5] }, 
 
    { "a": [10,100,1000] }, 
 
] 
 

 
let result = bar.map(function(e) { 
 
    return Object.assign({}, e, {a: e.a.map(a => a + 1)}) 
 
}) 
 

 
console.log(bar) 
 
console.log(result)

1

あなたは、オブジェクトのすべてのエントリを反復処理し、すべてのオブジェクトを持つ新しい配列と増分された配列を返すことができます。

let foo = [{ a: [1, 2, 3] }, { b: [7, 8, 9] }], 
 
    result = foo.map(o => Object.assign({}, ...Object.entries(o).map(([k, v]) => ({ [k]: v.map(b => b + 1) })))); 
 

 
console.log(result); 
 
console.log(foo);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

それは空のオブジェクトである第一引数の場合、それはfoo内のオブジェクトへの参照が解除されますので、私はObject.assign()を使用するときに注意するあなたを助言します。場合によっては、これはあなたが望むものかもしれません。

参照を保持する場合は、次のようにします。 "参照を壊す" ことで

var foo = [{ "a": [1,2,3]}], 
 
    bar = foo.map(o => (o.a = o.a.map(val => val + 1),o)); 
 

 
console.log(bar); 
 
foo[0].x = "whatever"; 
 
console.log(foo); 
 
console.log(bar);

+0

あなたがデータ構造をコピーする意味ですか?この場合、私はオブジェクトをオブジェクトではなくデータ構造として扱いたいので、これで問題はありません。 – hgiesel

+0

また、私は知らなかった、あなたはこのような矢印の関数を書くことができた、それは素晴らしいです! – hgiesel

+0

@hgiesel申し訳ありませんが、私の答えで参照している 'Object.assign()'について訂正しました。 – Redu