reversing a string, why the quotations? - javascript

I saw another stackoverflow thread here
one of the answers given was
function reverse(s){
return s.split("").reverse().join("");
}
so my question is, why are there quotation marks for split and join but not reverse?

That's because the 3 functions are different:
String.split( delimiter ); // delimiter = split by what
Array.reverse(); // reverse an array
// unlike other array functions such as sort() or join()
// there is no other option to specify because the function
// does only one thing only one way
Array.join( join_string ); // join_string = what string to insert
// between elements
Whenever you have doubts about how functions work read the documentation:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
Not all functions require one argument. Some take none. Some take two or three. Some have optional arguments.

reverse() is called on an array. The result of split("") being an array of letters (strings of one letter each to be precise).

.split("") Will spit a string based on a given parameter. in this case "" means no delimiter so it will split on each char and return an array of char. then reverse() method is call on that array. once it reversed then we have to join it back to the string. join("") will do that task for you. in this case "" means no delimiter for join so array will join each char together.

Related

How to use array.splice() after .join()?

I'm having trouble figuring out how to remove items from an array after using the join() function.
As you'll see, the first array.splice() works, but the second does not...
var recordsArray1 = ['a','b','c','d','e','f'];
console.log(recordsArray1.length);
recordsArray1.splice('a', 1);
console.log(recordsArray1);
var recordsArray2 = ['g','h','i','j','k','l'].join('\n');
console.log(recordsArray2.length);
recordsArray2.splice('g', 1);
console.log(recordsArray2);
Thanks for any help.
Tim
Array.prototype.join(separator) converts an array into a string seperated by separator. If you want to join the elements with a newline, perform the join after any other array operations, like slicing.
https://www.w3schools.com/jsref/jsref_join.asp
join turns it from an array into a string
If I understood your need correctly, you may want to map over the elements and add newline to each, instead of joining the array to a string. This should do:
recordsArray2 = ['g','h','i','j','k','l']
recordsArray2.map((x) => x + "\n")
First, your usage of splice is not right. Your intention seems to be "please, remove exactly one a" respectively "please remove a g". But that's not how splice works. The first parameter is the index to start at, the correct usage would be .splice(0, 1) (read: remove one element starting from index 0).
Second, join converts the Array to a string using the provided sequence. So, ['g','h','i','j','k','l'].join('\n'); yields g\nh\ni\n... as a string, which does not have a join method. So, to remove the g, I suggest to join the array after you removed the g: var arr =['g','h','i','j','k','l']; arr.splice(0, 1); arr = arr.join('\n'); (or do not join it after all, since I think it was not what you intended to do). Another way would to remove the G after joining, e.g. var arr =['g','h','i','j','k','l'].join('\n').substr(2) (which would return the string starting at the third character, so the g and the following \n are removed).

String to array select only elements with a length of 6

Lets suppose i have this string:
01234 ; 0123;0424 09234
How can i split these string by two arguments ' ' and ';',
Trim the single elements
and next, select only these elements of the array who have a length of 5
So that at the end it returns this array:
["01234","09234"]
My biggest problem with this task is that i dont know how i should split the string because always when i do:
a = "0123 9809; 04323 ";
b = a.split(' ').split(';')
I get this error:
TypeError: Object [object Array] has no method 'split'
Thanks for your help!
Use:
' 01234 ; 0123;0424 09234'.split(/\s|;/).filter(function (e) {
return e.trim().length === 5;
});
in the example above split accepts a regular expression used for splitting the string. After that we use the high-order function filter, which filters the input.
The is valid for all modern browsers.
.split() works on strings so that is why you are seeing the error - you are calling it on a string which returns an array, and they trying to call it again on the array. There are many ways to approach this.
I'd be tempted to take a short cut and replace all spaces with semicolons and then perform a single .split(';') to generate the array, and then use .filter() to filter out only those strings in the array that match the length you are looking for.

Regular Expression to get the last word from TitleCase, camelCase

I'm trying to split a TitleCase (or camelCase) string into precisely two parts using javascript. I know I can split it into multiple parts by using the lookahead:
"StringToSplit".split(/(?=[A-Z])/);
And it will make an array ['String', 'To', 'Split']
But what I need is to break it into precisely TWO parts, to produce an array like this:
['StringTo', 'Split']
Where the second element is always the last word in the TitleCase, and the first element is everything else that precedes it.
Is this what you are looking for ?
"StringToSplit".split(/(?=[A-Z][a-z]+$)/); // ["StringTo", "Split"]
Improved based on lolol answer :
"StringToSplit".split(/(?=[A-Z][^A-Z]+$)/); // ["StringTo", "Split"]
Use it like this:
s = "StringToSplit";
last = s.replace(/^.*?([A-Z][a-z]+)(?=$)/, '$1'); // Split
first = s.replace(last, ''); // StringTo
tok = [first, last]; // ["StringTo", "Split"]
You could use
(function(){
return [this.slice(0,this.length-1).join(''), this[this.length-1]];
}).call("StringToSplit".split(/(?=[A-Z])/));
//=> ["StringTo", "Split"]
In [other] words:
create the Array using split from a String
join a slice of that Array without the last element of that
Array
add that and the last element to a final Array

Javascript: How can I search and replace multiple items with matched groups?

Say I have a string like
"item:(one|two|three), item2:(x|y)"
Is there a single regex that could "factor" it into
"item:one, item:two, item:three, item2:x, item2:y"
Or must I resort to splitting and looping?
If I must split it up then how do I even turn
"item:(one|two|three)"
into
"item:one, item:two, item:three"
if the amount of things between the parentheses is variable? Are regexes useless for such a problem?
You could do it with a callback function:
str = str.replace(/(\w+):\(([^)]*)\)/gi, function(match,item,values)
{return item + ':' + values.split("|").join(', '+item+':')}
);
For every item, the first parentheses in the regex capture the item's name (i.e item) and the second set of (unescaped) parentheses capture the string of all values (i.e one|two|three). The latter are then split at | and joined together with , itemname: and then there is another item name appended to the beginning of the result.
This is probably the easiest way to combine regexes to find your data and split and join to build your new regex. The problem why it is not easier is, that you cannot capture an arbitrary number of consecutive values (one|two|three) in different capturing groups. You would only get the last one, if you tried to capture them individually.

String split returns an array with more elements than expected (empty elements)

I don't understand this behaviour:
var string = 'a,b,c,d,e:10.';
var array = string.split ('.');
I expect this:
console.log (array); // ['a,b,c,d,e:10']
console.log (array.length); // 1
but I get this:
console.log (array); // ['a,b,c,d,e:10', '']
console.log (array.length); // 2
Why two elements are returned instead of one? How does split work?
Is there another way to do this?
You could add a filter to exclude the empty string.
var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(function(el) {return el.length != 0});
A slightly easier version of #xdazz version for excluding empty strings (using ES6 arrow function):
var array = string.split('.').filter(x => x);
This is the correct and expected behavior. Given that you've included the separator in the string, the split function (simplified) takes the part to the left of the separator ("a,b,c,d,e:10") as the first element and the part to the rest of the separator (an empty string) as the second element.
If you're really curious about how split() works, you can check out pages 148 and 149 of the ECMA spec (ECMA 262) at http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
Use String.split() method with Array.filter() method.
var string = 'a,b,c,d,e:10.';
var array = string.split ('.').filter(item => item);
console.log(array); // [a,b,c,d,e:10]
console.log (array.length); // 1
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/split
trim the trailing period first
'a,b,c,d,e:10.'.replace(/\.$/g,''); // gives "a,b,c,d,e:10"
then split the string
var array = 'a,b,c,d,e:10.'.replace(/\.$/g,'').split('.');
console.log (array.length); // 1
That's because the string ends with the . character - the second item of the array is empty.
If the string won't contain . at all, you will have the desired one item array.
The split() method works like this as far as I can explain in simple words:
Look for the given string to split by in the given string. If not found, return one item array with the whole string.
If found, iterate over the given string taking the characters between each two occurrences of the string to split by.
In case the given string starts with the string to split by, the first item of the result array will be empty.
In case the given string ends with the string to split by, the last item of the result array will be empty.
It's explained more technically here, it's pretty much the same for all browsers.
According to MDN web docs:
Note: When the string is empty, split() returns an array containing
one empty string, rather than an empty array. If the string and
separator are both empty strings, an empty array is returned.
const myString = '';
const splits = myString.split();
console.log(splits);
// ↪ [""]
Well, split does what it is made to do, it splits your string. Just that the second part of the split is empty.
Because your string is composed of 2 part :
1 : a,b,c,d,e:10
2 : empty
If you try without the dot at the end :
var string = 'a,b,c:10';
var array = string.split ('.');
output is :
["a,b,c:10"]
You have a string with one "." in it and when you use string.split('.') you receive array containing first element with the string content before "." character and the second element with the content of the string after the "." - which is in this case empty string.
So, this behavior is normal. What did you want to achieve by using this string.split?
try this
javascript gives two arrays by split function, then
var Val = "abc#gmail.com";
var mail = Val.split('#');
if(mail[0] && mail[1]) { alert('valid'); }
else { alert('Enter valid email id'); valid=0; }
if both array contains length greater than 0 then condition will true

Categories

Resources