- `getValue(str)` is such a vague name for the function and its parameter, it could mean anything!  Furthermore, "get" implies that this is a getter function that retrieves something, which is not the case.
- Your regex is ineffective.  Capturing parentheses could be useful, but you didn't actually use them right, such that you ended up having to pass a dirty string to `parseInt()` and extract the last character the harder way.
- You neglected to scope `match`, such that it acts as a global variable.  The regex-matching statement is written twice; the assignment could be done within the loop condition instead.
- The `if` statements should be an if-else chain, since the conditions are mutually exclusive.  However, since the branches are all so similar, a lookup table would be more elegant.

<!-- begin snippet: js hide: false console: true babel: null -->

<!-- language: lang-js -->

    function durationSeconds(timeExpr)
    {
    	var units = {'h': 3600, 'm': 60, 's': 1};
    	var regex = /(\d+)([hms])/g;

    	let seconds = 0;
    	var match;
    	while ((match = regex.exec(timeExpr))) 
    	{
    		seconds += parseInt(match[1]) * units[match[2]];
    	}

    	return seconds;
    }

    console.log( durationSeconds("4h12m32s") );

<!-- end snippet -->

Alternatively, if you expect that the units will be in the conventional order, you don't have to loop at all.

<!-- begin snippet: js hide: false console: true babel: null -->

<!-- language: lang-js -->

    function durationSeconds(timeExpr)
    {
    	var match = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(timeExpr);
    	return 3600 * (parseInt(match[1]) || 0)
    	       + 60 * (parseInt(match[2]) || 0)
    	       +      (parseInt(match[3]) || 0);
    }

    console.log( durationSeconds("4h32s") );

<!-- end snippet -->