Problem
I have an array and must fill another one.
Depending of a boolean I copy first or second element and the rest must be as is…
Currently I do it like this (data
has the desired info):
const newArray = [];
newArray[0] = theBoolean ? data[0] : data[1];
for (let i = 2; i < data.length; i += 1) {
newArray[i - 1] = data[i];
}
I’ve tried with shift and slice but no success…
¿how can I beautify this snippet?
Solution
You’re on the right track trying slice
. Here’s an example of using it with no loops required.
Initialisation
You could initialise newArray
with an element directly in the declaration, removing the need for newArray[0] = ...
:
const newArray = [theBoolean ? data[0] : data[1]];
Pushing all other elements from data to newArray:
You could use Array.prototype.slice
to get all other elements: data.slice(2)
.
Using spread operator:
const newArray = [theBoolean ? data[0] : data[1]];
newArray.push(...data.slice(2));
// or, one liner:
const newArray = [theBoolean ? data[0] : data[1], ...data.slice(2)];
Using Array.prototype.concat
:
const newArray = [theBoolean ? data[0] : data[1]].concat(data.slice(2));
Using Function.prototype.apply
:
const newArray = [theBoolean ? data[0] : data[1]];
[].push.apply(newArray, data.slice(2));
First, I think your current technique could be improved by using push
rather than array indices when inserting.
However another couple of options come to mind:
-
Using
Array.filter
to remove the unwanted itemconst newArray = data.filter(function (_, index) { return theBoolean? index !== 1 : index !== 0; });
-
To delete the unwanted item with
splice
if you do not mind mutating the source array.
array.splice(start, deleteCount)
start
Index at which to start changing the array (with origin 0). If greater
than the length of the array, actual starting index will be set to the
length of the array. If negative, will begin that many elements from
the end of the array.deleteCount Optional
An integer indicating the number of old array elements to remove. If
deleteCount is 0, no elements are removed. In this case, you should
specify at least one new element. If deleteCount is greater than the
number of elements left in the array starting at start, then all of
the elements through the end of the array will be deleted.
data.splice(theBoolean? 1 : 0, 1);
How about:
const newArray = data.slice(1);
if (theBoolean) newArray[0] = data[0];