Iterative solution for flattening n-th nested arrays in Javascript

后端 未结 8 1186
猫巷女王i
猫巷女王i 2021-02-04 12:46

Can anyone show me an iterative solution for the following problem? I solved it recursively but struggled with an iterative solution. (Facebook Technical Interv

8条回答
  •  渐次进展
    2021-02-04 13:40

    Here are two approaches, recursive and iterative and their comparison to Array.flat. Maybe it'll help someone

    const arrayToFlatten = [[1], [2, [3]], null, [[{}]], undefined];
    
    // takes an array and flattens it recursively, default depth is 1 (just like Array.flat())
    function flattenRecursive(arr, depth = 1) {
      let myArray = [];
    
      if (depth === 0){ // if you've reached the depth don't continue
        myArray = arr;
      } else if(!Array.isArray(arr)) { // add item to array if not an array
        myArray.push(arr);
      } else { // flatten each item in the array then concatenate
        arr.forEach(item => {
          const someNewArray = flattenRecursive(item, depth - 1);
          myArray = myArray.concat(someNewArray);
        });
      }
      
      return myArray;
    }
    
    // takes an array and flattens it using a loop, default depth is 1 (just like Array.flat())
    function flattenIterative(arr, depth = 1) {
      let result = arr;
    
      // if an element is an array
      while(result.some(Array.isArray) && depth) {
        // flatten the array by one level by concating an empty array and result using apply
        result = [].concat.apply([], result);
        depth--; // track depth
      }
    
      return result;
    }
    
    console.log(arrayToFlatten.flat(2)); // ES^
    console.log(flattenRecursive(arrayToFlatten, 2));
    console.log(flattenIterative(arrayToFlatten, 2));

提交回复
热议问题