2016-12-01 3 views
1

私は次のコードブロックがうまく動作しますが、ECMA6の簡略化が不足しているように感じます。ECMA6 forEachとfortheachの中間の機能でスプレッドしますか?

コンセプトコード:

//set.data is an array of objects 
service.find().then(set => { 
    set.data.forEach(function(part, index) { 
     set.data[index] = itemModificationFunction(set.data[index]); 
    }); 
    this.items.push(...set.data); 
}); 

var itemModificationFunction = function (data) { 
    data.addFoo = 'additionalFoo'; 
    return data; 
}; 

...対。このようなもの...

service.find().then(set => { 
    this.items.push(itemModificationFunction(...set.data)); 
}); 

...最初の配列要素だけがプッシュされるため、もちろん動作しません。よりクリーンな方法がありますか?代わりにforEach

+2

'const newData = set.data.map(item => itemModificationFunction(item)); this.items.push(... newData); '? – zerkms

+0

ありがとう! 'this.items.push(... set.data.map(item => itemModificationFunction(item)));' – XediDC

+2

本当に読めない怪物を作りたければ、これもうまくいきます- はい。 – zerkms

答えて

1

使用map

service.find().then(set => this.items.push(...set.data.map(modifyItem))); 
0

普及やforEachのどちらが必要であるが、私はこれを見ていない驚きました。これは最も直接的なコードであり、大きな配列のほうがはるかに高速です。

service.find().then(set => { 
    this.items = this.items.concat(set.data.map(itemModificationFunction)) 
}); 
+0

意味的に同等でない場合を除きます。 – zerkms

+0

'Array.prototype.concat'は、インプレース内のソース配列を変更しません。 – zerkms

+0

そして今、質問:OPはあなたのコードを他のものよりも好むべきですか? – zerkms