1

What is the most efficient way to move the elements within the nested portion of the inner array out into the main array?

Example: [1,[2,3],4] -> [1,2,3,4]

my attempt

var old_arr = ["one", ["two", "three"], "four"];
var new_arr = [];

function arrayfix(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (typeof arr[i] == typeof {}) { //checks to see if it's an object
      for (var j = 0; j < Object.keys(arr[i]).length; j++) {
        new_arr.push(arr[i][j]);
      }
    }
    new_arr.push(arr[i]);
  }
  return new_arr;
}

console.log(arrayfix(old_arr));

actual outcome

[ 'one', 'two', 'three', [ 'two', 'three' ], 'four' ]

desired outcome

[ 'one', 'two', 'three', 'four' ]
Luca Kiebel
  • 9,790
  • 7
  • 29
  • 44
Eliana Lopez
  • 161
  • 1
  • 1
  • 8

3 Answers3

2

There is a built-in prototype function in Array called flat for that purpose.

One parameter: The depth level specifying how deep a nested array structure should be flattened. Defaults to 1.

flat() will flat a 2D to 1D flat(2) will flat out a 3D to 1D.

var old_arr= ["one",["two","three"],"four"];
console.log(old_arr.flat());
Amila Senadheera
  • 12,229
  • 15
  • 27
  • 43
1

flat function is what you are looking for.

var old_arr= ["one",["two","three"],"four"];
var new_arr = old_arr.flat(); 
console.log(new_arr);
Sudhir Ojha
  • 3,247
  • 3
  • 14
  • 24
Tomáš Šturm
  • 489
  • 4
  • 8
1

Either use the Array#flat() method, like Amila Senadheera suggested, or change your function to not always add the element to the new array, like so:

var old_arr= ["one",["two","three"],"four"];

function arrayfix(arr){
    let new_arr = [];
    for(let i =0; i < arr.length; i++) {
        if(typeof arr[i] == typeof {}) { //checks to see if it's an object
            for(let j =0; j < Object.keys(arr[i]).length; j++) {
                new_arr.push(arr[i][j]);
            }
        } else { // if it's an array, don't add it back to the new array
          new_arr.push(arr[i]);
        }
        
    }
    return new_arr;
}

console.log(arrayfix(old_arr));
Luca Kiebel
  • 9,790
  • 7
  • 29
  • 44