Copy part of array in javascript

Posted on

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:

  1. Using Array.filter to remove the unwanted item

    const newArray = data.filter(function (_, index) {
        return theBoolean? index !== 1 : index !== 0;
    });
    
  2. 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];

Leave a Reply

Your email address will not be published. Required fields are marked *