Code Review Stack Exchange is a question and answer site for peer programmer code reviews. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question
up vote 4 down vote accepted

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));
share|improve this answer

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);
share|improve this answer

How about:

const newArray = data.slice(1);
if (theBoolean) newArray[0] = data[0];
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.