.flat() is not a function, what's wrong?

JavascriptArraysFlat

Javascript Problem Overview


The following code

function steamrollArray(arr) {
  // I'm a steamroller, baby
  return arr.flat();
}

steamrollArray([1, [2], [3, [[4]]]]);

returns

> arr.flat is not a function

I tried it in Firefox and Chrome v67 and the same result has happened.

What's wrong?

Javascript Solutions


Solution 1 - Javascript

The flat method is not yet implemented in common browsers (only Chrome v69, Firefox Nightly and Opera 56). It’s an experimental feature. Therefore you cannot use it yet.

You may want to have your own flat function instead:

Object.defineProperty(Array.prototype, 'flat', {
    value: function(depth = 1) {
      return this.reduce(function (flat, toFlatten) {
        return flat.concat((Array.isArray(toFlatten) && (depth>1)) ? toFlatten.flat(depth-1) : toFlatten);
      }, []);
    }
});

console.log(
  [1, [2], [3, [[4]]]].flat(2)
);

The code was taken from here by Noah Freitas originally implemented to flatten the array with no depth specified.

Solution 2 - Javascript

This can also work.

let arr = [ [1,2,3], [2,3,4] ];
console.log([].concat(...arr))

Or for older browsers,

[].concat.apply([], arr);

Solution 3 - Javascript

Array.flat is not supported by your browser. Below are two ways to implement it.

As a function, the depth variable specifies how deep the input array structure should be flattened (defaults to 1; use Infinity to go as deep as it gets) while the stack is the flattened array, passed by reference on recursive calls and eventually returned.

function flat(input, depth = 1, stack = [])
{
	for (let item of input)
	{
		if (item instanceof Array && depth > 0)
		{
			flat(item, depth - 1, stack);
		}
		else {
			stack.push(item);
		}
	}
	
	return stack;
}

As a Polyfill, extending Array.prototype if you prefer the arr.flat() syntax:

if (!Array.prototype.flat)
{
	Object.defineProperty(Array.prototype, 'flat',
	{
		value: function(depth = 1, stack = [])
		{
			for (let item of this)
			{
				if (item instanceof Array && depth > 0)
				{
					item.flat(depth - 1, stack);
				}
				else {
					stack.push(item);
				}
			}
			
			return stack;
		}
	});
}

Solution 4 - Javascript

Similar issue, solved by using ES6 .reduce() method:

const flatArr = result.reduce((acc, curr) => acc.concat(curr),[]);

Solution 5 - Javascript

use _.flatten from lodash package ;)

Solution 6 - Javascript

var arr=[[1,2],[3,4],[5,6]];
var result=[].concat(...arr);
console.log(result);    //output: [ 1, 2, 3, 4, 5, 6 ]

Solution 7 - Javascript

Another simple solution is _.flattenDeep() on lodash

https://lodash.com/docs/4.17.15#flattenDepth

const flatArrays = _.flattenDeep([1, [2], [3, [[4]]]]);

console.log(flatArrays);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

Solution 8 - Javascript

const array = [  [    [6, 6],
    [3, 3],
  ],
  [[7, 7, [9]]],
]

function simplifyArray(array) {
  const result = []

  function recursivePushElem(arr) {
    arr.forEach(i => {
      if (Array.isArray(i)) recursivePushElem(i)
      else result.push(i)
    })
  }
  recursivePushElem(array)

  console.log(result)
  return result
}

simplifyArray(array)

Solution 9 - Javascript

you could simply use this [].concat(...objArrs) that would work the same as the flat() method and allow more compatibility in browsers

Solution 10 - Javascript

Not sure if it is a valid answer however in my attemp to flat an array I employed the destructuring_assignment introduced in ES6.

// typeScriptArray:Array<Object> = new Array<Object>();
let concatArray = [];

let firstArray = [1,2,3];
let secondArray = [2,3,4];

concatArray.push(...firstArray);
concatArray.push(...secondArray);

console.log(concatArray);

It works like a charm even though I'm not sure if any broswer compatibily issues may arise.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTechnoKnightView Question on Stackoverflow
Solution 1 - JavascriptIvanView Answer on Stackoverflow
Solution 2 - JavascriptdubuchaView Answer on Stackoverflow
Solution 3 - JavascriptresuView Answer on Stackoverflow
Solution 4 - JavascriptirinaView Answer on Stackoverflow
Solution 5 - JavascriptBash LordView Answer on Stackoverflow
Solution 6 - JavascriptKvitDView Answer on Stackoverflow
Solution 7 - JavascriptMo.View Answer on Stackoverflow
Solution 8 - JavascriptNITRINOView Answer on Stackoverflow
Solution 9 - Javascriptkelvin nyadzayoView Answer on Stackoverflow
Solution 10 - Javascriptgiannis christofakisView Answer on Stackoverflow