6

I have this array:

aItems = [{ "PropertyA": "apple", "PropertyB": "banana", "PropertyC": "dog", "PropertyD": "hotdog", "PropertyE": "coldcat", "PropertyF": "Y", "PropertyG": "N" }, ..., { "PropertyA": "this", "PropertyB": "is", "PropertyC": "json", "PropertyD": "code", "PropertyE": "wow", "PropertyF": "N", "PropertyG": "N" }] 

I would like use lodash to obtain this result:

aItems = [{ "propertyA": "apple", "propertyB": "banana", "propertyC": "dog", "propertyD": "hotdog", "propertyE": "coldcat", "propertyNEW": true, "propertyG": false }, ..., { "propertyA": "this", "propertyB": "is", "propertyC": "json", "propertyD": "code", "propertyE": "wow", "propertyNEW": false, "propertyG": false }] 

I want map each property name with other names and change the value for some specific properties. Can I do it using lodash?

2 Answers 2

11

Yes, since lodash v3.8.0 you can remap objects in any way desireable

ES5 code

var items = [ { oldKey: 'oldValue' /*...*/ } ] var keyMapping = { oldKey: 'newKey' /*...*/ } var valueMapping = { oldValue: 'newValue' /*...*/ } var remapper = function(item){ return _(item) // lodash chain start .mapKeys( function(v, k){ return keyMapping[k] } ) .mapValues( function(v){ return valueMapping[v] } ) .value() // lodash chain end } var remappedItems = items.map(remapper) 

ES2015/ES6 code

let items = [ { oldKey: 'oldValue' /*...*/ } ] let keyMapping = { oldKey: 'newKey' /*...*/ } let valueMapping = { oldValue: 'newValue' /*...*/ } let remapper = item => _(item) // lodash chain start .mapKeys( (v, k)=> keyMapping[k] ) .mapValues( v => valueMapping[v] ) .value() // lodash chain end let remappedItems = items.map(remapper) 
Sign up to request clarification or add additional context in comments.

1 Comment

If you want all the key pairs and only want to change one or two keys and don't want to list all the keys in keyMapping, you can change: <br/> .mapKeys( (v, k)=> keyMapping[k] ) <br/> to <br/> .mapKeys( (v, k)=> keyMapping[k] || k)
4

Create a mapping of old and new keys, like this

var keyMapping = {'PropertyA': 'propertyA', ..., 'PropertyF': 'propertyNEW'} 

and also a mapping of old and new values, like this

var valueMapping = {'Y': true, 'F': false} 

And then using _.map and _.transform, you can transform the object, like this

var result = _.map(allItems, function(currentObject) { return _.transform(currentObject, function(result, value, key) { if (key === 'PropertyF' || key === 'PropertyG') { value = valueMapping(value); } result[keyMapping[key]] = value; }); }); 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.