2016-05-25 6 views
3

lodashを使用して、オブジェクトのプロパティを選択的に変更したいと考えています。オブジェクトのフィルタリングされたプロパティに関数を適用するには、lodashを使用してください。

var foo = { 'a': 1, 'b': 2, 'c': 3 }; 

function addOne(num) { 
    return num + 1; 
} 

var propsToTransform = ['a', 'b']; 

_(foo).pick(propsToTransfrom) 
    .map(addOne); 

// I want foo = { 'a': 2, 'b':3, 'c':3 } 

それは私が上に概説してきたか、私はandlrcが指摘したようにあなたが_.mapValues_.protoype.valueを探している

_.forEach(propsToTransform, (prop) => { 
    if (foo[prop]) { 
    foo[prop] = addOne(foo[prop]); 
    } 
}); 

答えて

4

ような何かに固執すべき組成物の種類を使用して、これを達成することが可能です。あなたは、新しい値を持つ新しいオブジェクトを作成し終わると、元の1とそれをマージします:

var foo = { 'a': 1, 'b': 2, 'c': 3 }; 
var propsToTransfrom = ['a', 'b'] 

// Create a new object with the new, modified values and merge it onto the original one 
var bar = _.merge(foo, _(foo).pick(propsToTransfrom).mapValues(addOne).value()); 

console.log(bar); // { 'a': 2, 'b': 3, 'c': 3 } 

function addOne(num) { 
    return num + 1; 
} 
+0

これは良い解決策です。あなたはもう少し積極的になり、「バー」で逃げることができます。 'merge'は' foo'を変更するので、 '_.merge(foo、_(foo).pick ....);に短縮されます。 'console'の出力を '{'a':2、 'b':3、 'c':3}にすることができれば、@dmlittleは受け入れられるとマークすることができます。 – trstephen

+0

@trstephen done! :) – dmlittle

関連する問題