SpaceNinja
SpaceNinja

Reputation: 512

Remove Characters from All Keys in an Object (Lodash OK)

I have a bothersome length of characters before all keys in this object. Since they are all the same, I would like to do a .map() or forEach() or something with a .slice() in it to remove the first n characters. How is this done to all keys in the object?

I should say that we are already importing Lodash in the project so I can use that.

So I need to turn this:

{
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
}

and turn it into:

{
  "a": "apple",
  "b": "banana",
  "c": "carrot",
  "d": "diakon"
}

Upvotes: 0

Views: 1125

Answers (5)

daedalus28
daedalus28

Reputation: 1637

If you've already got lodash, _.mapKeys is what you're looking for. Here's an example of what you asked for directly (to just slice to 19 characters), but you could easily do a split or replace or whatever else you'd like:

var _ = require('lodash')

let data = {
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
}
_.mapKeys(data, (val, key) => key.slice(19))

Here's a runkit: https://runkit.com/daedalus28/slice-keys

Upvotes: 2

epascarello
epascarello

Reputation: 207511

Use object.entries to get the keys and values. Loop over changing the key.

Changing the object directly

var obj = {
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
}

// Object.entries(obj).forEach(function(arr) {
//   var key = arr[0]
//   var value = arr[1]
//   delete obj[key]
//   obj[key.split(".").pop()] = value
// })
Object.entries(obj).forEach(([key, value]) => {
  delete obj[key]
  obj[key.split(".").pop()] = value
})

console.log(obj)

or reduce to create a new object

var obj = {
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
}

// const updated = Object.entries(obj).forEach(function(obj, arr) {
//   var key = arr[0]
//   var value = arr[1]
//   obj[key.split(".").pop()] = value
//   return obj
// }, {})
const updated = Object.entries(obj).reduce((obj, [key, value]) => {
  obj[key.split(".").pop()] = value
  return obj
}, {})

console.log(updated)

Upvotes: 3

Dacre Denny
Dacre Denny

Reputation: 30360

Another approach that avoinds the need for Object.fromEntries(), would be to use Array.reduce() as shown:

const input = {
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
};

const output = Object.entries(input).reduce((result, [key, value]) => {
  
  /* Pluck last letter of key string */
  const letter = key.slice(-1);

  /* Insert letter key/value into result object */
  return { ...result, [letter] : value };
  
}, {});

console.log(output);

Upvotes: 2

JBaczuk
JBaczuk

Reputation: 14619

You could use the new Object.fromEntries along with Object.entries:

let remove = {
    this: {
        string: {}
    }
}

remove.this.string.a = "apple"
remove.this.string.b = "banana"
remove.this.string.c = "carrot"
remove.this.string.d = "diakon"

console.log(remove.this.string)

let fixed = Object.fromEntries(
    Object.entries(remove.this.string)
        .map(([key, val]) => [key, val])
)

console.log(fixed)

Result: { a: 'apple', b: 'banana', c: 'carrot', d: 'diakon' }

Update:

For keys that are all one string:

let remove = {
    'remove.this.string.a': 'apple',
    'remove.this.string.b': 'banana',
    'remove.this.string.c': 'carrot',
    'remove.this.string.d': 'diakon'
}

let fixed = Object.fromEntries(
    Object.entries(remove)
        .map(([key, val]) => [key.replace('remove.this.string.', ''), val])
)

console.log(fixed)

Result: { a: 'apple', b: 'banana', c: 'carrot', d: 'diakon' }

Upvotes: 1

junvar
junvar

Reputation: 11574

let obj = {
  'remove.this.string.a': "apple",
  'remove.this.string.b': "banana",
  'remove.this.string.c': "carrot",
  'remove.this.string.d': "diakon"
};

let transformed = Object.entries(obj).reduce((t, [key, value]) => {
  t[key.substr(19)] = value;
  return t;
}, {});

console.log(transformed);

Upvotes: 1

Related Questions