Convert string parameter to an array of one element
I wrote a function which has to support two types of a paramter names
for a list of values. Internally it deals with the parameter as an array.
A single name is given as string and multiples names are given as an array of strings.
// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
I found a solution using Array.of()
in combination with flatten()
which needs some babel configuration.
doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
Is there an idiomatic way in JavaScript to get an array without a type check?
javascript arrays string ecmascript-6
add a comment |
I wrote a function which has to support two types of a paramter names
for a list of values. Internally it deals with the parameter as an array.
A single name is given as string and multiples names are given as an array of strings.
// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
I found a solution using Array.of()
in combination with flatten()
which needs some babel configuration.
doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
Is there an idiomatic way in JavaScript to get an array without a type check?
javascript arrays string ecmascript-6
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
6
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
1
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
Why can't you just(names instanceof Array ? names : [names]).map()
?
– Salman A
23 hours ago
add a comment |
I wrote a function which has to support two types of a paramter names
for a list of values. Internally it deals with the parameter as an array.
A single name is given as string and multiples names are given as an array of strings.
// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
I found a solution using Array.of()
in combination with flatten()
which needs some babel configuration.
doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
Is there an idiomatic way in JavaScript to get an array without a type check?
javascript arrays string ecmascript-6
I wrote a function which has to support two types of a paramter names
for a list of values. Internally it deals with the parameter as an array.
A single name is given as string and multiples names are given as an array of strings.
// simplified example
let doSome = names => names.map(name => name.toUpperCase())
names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function
I found a solution using Array.of()
in combination with flatten()
which needs some babel configuration.
doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());
Is there an idiomatic way in JavaScript to get an array without a type check?
javascript arrays string ecmascript-6
javascript arrays string ecmascript-6
edited 14 hours ago
4dc0
42739
42739
asked yesterday
sschmeck
3,1091937
3,1091937
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
6
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
1
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
Why can't you just(names instanceof Array ? names : [names]).map()
?
– Salman A
23 hours ago
add a comment |
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
6
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
1
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
Why can't you just(names instanceof Array ? names : [names]).map()
?
– Salman A
23 hours ago
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
6
6
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
1
1
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
Why can't you just
(names instanceof Array ? names : [names]).map()
?– Salman A
23 hours ago
Why can't you just
(names instanceof Array ? names : [names]).map()
?– Salman A
23 hours ago
add a comment |
3 Answers
3
active
oldest
votes
You can use Array.concat()
, since concat accepts both arrays and non arrays:
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
The type check is now hidden away inArray.prototype.concat()
...
– Eric Duminil
yesterday
add a comment |
You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.
It means you can call the function as names('Homer')
or names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
If you really want to call the function with an array as argument, you can use the spread syntax :
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
If you use it with a string, you'll get back an array of characters, though:
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
add a comment |
Maybe an maybe upcomming method of Array#flat
would help in this case (works actually only in Chrome and FF).
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaringArray.of
.
– Konrad Rudolph
yesterday
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54039152%2fconvert-string-parameter-to-an-array-of-one-element%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use Array.concat()
, since concat accepts both arrays and non arrays:
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
The type check is now hidden away inArray.prototype.concat()
...
– Eric Duminil
yesterday
add a comment |
You can use Array.concat()
, since concat accepts both arrays and non arrays:
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
The type check is now hidden away inArray.prototype.concat()
...
– Eric Duminil
yesterday
add a comment |
You can use Array.concat()
, since concat accepts both arrays and non arrays:
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
You can use Array.concat()
, since concat accepts both arrays and non arrays:
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
const names = (v) => .concat(v).map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']
answered yesterday
Ori Drori
74.1k127892
74.1k127892
The type check is now hidden away inArray.prototype.concat()
...
– Eric Duminil
yesterday
add a comment |
The type check is now hidden away inArray.prototype.concat()
...
– Eric Duminil
yesterday
The type check is now hidden away in
Array.prototype.concat()
...– Eric Duminil
yesterday
The type check is now hidden away in
Array.prototype.concat()
...– Eric Duminil
yesterday
add a comment |
You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.
It means you can call the function as names('Homer')
or names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
If you really want to call the function with an array as argument, you can use the spread syntax :
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
If you use it with a string, you'll get back an array of characters, though:
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
add a comment |
You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.
It means you can call the function as names('Homer')
or names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
If you really want to call the function with an array as argument, you can use the spread syntax :
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
If you use it with a string, you'll get back an array of characters, though:
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
add a comment |
You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.
It means you can call the function as names('Homer')
or names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
If you really want to call the function with an array as argument, you can use the spread syntax :
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
If you use it with a string, you'll get back an array of characters, though:
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.
It means you can call the function as names('Homer')
or names('Bart', 'Lisa')
:
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
If you really want to call the function with an array as argument, you can use the spread syntax :
console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]
If you use it with a string, you'll get back an array of characters, though:
console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
function names(...args){
return args.map(name => name.toUpperCase());
}
console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']
answered yesterday
Eric Duminil
39.3k53068
39.3k53068
add a comment |
add a comment |
Maybe an maybe upcomming method of Array#flat
would help in this case (works actually only in Chrome and FF).
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaringArray.of
.
– Konrad Rudolph
yesterday
add a comment |
Maybe an maybe upcomming method of Array#flat
would help in this case (works actually only in Chrome and FF).
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaringArray.of
.
– Konrad Rudolph
yesterday
add a comment |
Maybe an maybe upcomming method of Array#flat
would help in this case (works actually only in Chrome and FF).
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
Maybe an maybe upcomming method of Array#flat
would help in this case (works actually only in Chrome and FF).
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
const names = unknown => [unknown].flat().map(name => name.toUpperCase())
console.log(names(['Bart', 'Lisa']));
console.log(names('Homer'));
answered yesterday
Nina Scholz
177k1390155
177k1390155
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaringArray.of
.
– Konrad Rudolph
yesterday
add a comment |
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaringArray.of
.
– Konrad Rudolph
yesterday
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
This answer is identical to the solution OP wants to improve, but using a different polyfill.
– shiftweave
yesterday
1
1
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring
Array.of
.– Konrad Rudolph
yesterday
@shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring
Array.of
.– Konrad Rudolph
yesterday
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54039152%2fconvert-string-parameter-to-an-array-of-one-element%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday
6
Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday
1
@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday
Why can't you just
(names instanceof Array ? names : [names]).map()
?– Salman A
23 hours ago