2

I have a bunch of strings in the format 'TYPE_1_VARIABLE_NAME'.

The goal is to get 3 variables in the form of:

varType = 'TYPE',
varNumber = '1',
varName = 'VARIABLE_NAME'

What's the most efficient way of achieving this?

I know I can use:

var firstUnderscore = str.indexOf('_')
varType = str.slice(0, firstUnderscore))
varNumber = str.slice(firstUnderscore+1,firstUnderscore+2)
varName = str.slice(firstUnderscore+3)

but this feels like a poor way of doing it. Is there a better way? RegEx?

Or should I just rename the variable to 'TYPE_1_variableName' and do a:

varArray = str.split('_')

and then get them with:

varType = varArray[0],
varNumber = varArray[1],
varName = varArray[2]

Any help appreciated. jQuery also ok.

Simple Simon
  • 712
  • 2
  • 8
  • 23

3 Answers3

2

Regex solution

Given that the first and second underscores are the delimiters, this regex approach will extract the parts (allowing underscores in the last part):

//input data
var string = 'TYPE_1_VARIABLE_NAME';

//extract parts using .match()
var parts = string.match(/([^_]+)_([^_]+)_([^$]+)/);

//indexes 1 through 3 contains the parts
var varType = parts[1];
var varNumber = parts[2];
var varName = parts[3];

Given that the first variable consists of characters and the second of digits, this more specific regex could be used instead:

var parts = string.match(/(\w+)_(\d)_(.+)/);

Non-regex solution

Using .split('_'), you could do this:

//input data
var string = 'TYPE_1_VARIABLE_NAME';

//extract parts using .split()
var parts = string.split('_');

//indexes 0 and 1 contain the first parts
//the rest of the parts array contains the last part
var varType = parts[0];
var varNumber = parts[1];
var varName = parts.slice(2).join('_');

In matters of efficiency, both approaches contain about the same amount of code.

Tomas Langkaas
  • 4,551
  • 2
  • 19
  • 34
1

You could use regex and split

var string='TYPE_1_VARIABLE_NAME';

var div=string.split(/^([A-Z]+)_(\d+)_(\w+)$/);

console.log('type:'+div[1]);
console.log('num:'+div[2]);
console.log('name:'+div[3]);
depperm
  • 10,606
  • 4
  • 43
  • 67
0

Here's an answer I found here:

var array = str.split('_'),
    type = array[0], number = array[1], name = array[2];

ES6 standardises destructuring assignment, which allows you to do what Firefox has supported for quite a while now:

var [type, number, name] = str.split('_');

You can check browser support using Kangax's compatibility table.

Here's a sample Fiddle

Community
  • 1
  • 1
dokgu
  • 4,957
  • 3
  • 39
  • 77