合并/展平数组数组

时间:2012-06-02 18:53:47

标签: javascript arrays flatten

我有一个像以下的JavaScript数组:

[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]

我如何将单独的内部数组合并为:

["$6", "$12", "$25", ...]

90 个答案:

答案 0 :(得分:1546)

您可以使用concat合并数组:

var arrays = [
  ["$6"],
  ["$12"],
  ["$25"],
  ["$25"],
  ["$18"],
  ["$22"],
  ["$10"]
];
var merged = [].concat.apply([], arrays);

console.log(merged);

使用apply的{​​{1}}方法只会将第二个参数作为数组,因此最后一行与此相同:

concat

还有一个实验Array.prototype.flat()方法(尚未成为ECMAScript标准的一部分),您可以使用它来展平数组,尽管it is not yet available in Edge or Node.js

var merged2 = [].concat(["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]);

答案 1 :(得分:430)

这是一个简短的函数,它使用一些较新的JavaScript数组方法来展平n维数组。

function flatten(arr) {
  return arr.reduce(function (flat, toFlatten) {
    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  }, []);
}

用法:

flatten([[1, 2, 3], [4, 5]]); // [1, 2, 3, 4, 5]
flatten([[[1, [1.1]], 2, 3], [4, 5]]); // [1, 1.1, 2, 3, 4, 5]

答案 2 :(得分:291)

有一个容易混淆的隐藏方法,它构造一个新数组而不改变原始数组:

var oldArray = [[1],[2,3],[4]];
var newArray = Array.prototype.concat.apply([], oldArray);
console.log(newArray); // [ 1, 2, 3, 4 ]

答案 3 :(得分:169)

最好通过javascript reduce功能来完成。

var arrays = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]];

arrays = arrays.reduce(function(a, b){
     return a.concat(b);
}, []);

或者,使用ES2015:

arrays = arrays.reduce((a, b) => a.concat(b), []);

js-fiddle

Mozilla docs

答案 4 :(得分:65)

这里的大多数答案都不适用于巨大的(例如200 000个元素)阵列,即使它们这样做,它们也会变慢。 polkovnikov.ph's answer具有最佳性能,但它不适用于深度展平。

这是最快的解决方案,也适用于具有多层嵌套的数组

const flatten = function(arr, result = []) {
  for (let i = 0, length = arr.length; i < length; i++) {
    const value = arr[i];
    if (Array.isArray(value)) {
      flatten(value, result);
    } else {
      result.push(value);
    }
  }
  return result;
};

实施例

巨大阵列

flatten(Array(200000).fill([1]));

它处理大型数组就好了。在我的机器上,这段代码需要大约14毫秒才能执行。

嵌套数组

flatten(Array(2).fill(Array(2).fill(Array(2).fill([1]))));

它适用于嵌套数组。此代码生成[1, 1, 1, 1, 1, 1, 1, 1]

具有不同嵌套级别的数组

flatten([1, [1], [[1]]]);

像这样展平数组没有任何问题。

答案 5 :(得分:52)

更新:事实证明此解决方案不适用于大型数组。如果您正在寻找更好,更快的解决方案,请查看this answer

function flatten(arr) {
  return [].concat(...arr)
}

简单地展开arr并将其作为参数传递给concat(),它将所有数组合并为一个。它相当于[].concat.apply([], arr)

你也可以试试深度展平:

function deepFlatten(arr) {
  return flatten(           // return shalowly flattened array
    arr.map(x=>             // with each x in array
      Array.isArray(x)      // is x an array?
        ? deepFlatten(x)    // if yes, return deeply flattened x
        : x                 // if no, return just x
    )
  )
}

请参阅JSBin上的演示。

本回答中使用的ECMAScript 6元素的引用:

附注:所有浏览器都不支持find()和箭头功能等方法,但这并不意味着您现在无法使用这些功能。只需使用Babel - 它就可以将ES6代码转换为ES5。

答案 6 :(得分:49)

您可以使用Underscore

var x = [[1], [2], [3, 4]];

_.flatten(x); // => [1, 2, 3, 4]

答案 7 :(得分:38)

通用程序意味着每次我们需要利用特定行为时,我们都不必重写复杂性。

concatMap(或flatMap)正是我们在这种情况下所需要的。

&#13;
&#13;
// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.map(f).reduce(concat, [])

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)

// your sample data
const data =
  [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]

console.log (flatten (data))
&#13;
&#13;
&#13;

远见

是的,你猜对了,它只会压扁一个级别,这正是应该工作的方式

想象一下像这样的一些数据集

&#13;
&#13;
// Player :: (String, Number) -> Player
const Player = (name,number) =>
  [ name, number ]

// team :: ( . Player) -> Team
const Team = (...players) =>
  players

// Game :: (Team, Team) -> Game
const Game = (teamA, teamB) =>
  [ teamA, teamB ]

// sample data
const teamA =
  Team (Player ('bob', 5), Player ('alice', 6))

const teamB =
  Team (Player ('ricky', 4), Player ('julian', 2))

const game =
  Game (teamA, teamB)

console.log (game)
// [ [ [ 'bob', 5 ], [ 'alice', 6 ] ],
//   [ [ 'ricky', 4 ], [ 'julian', 2 ] ] ]
&#13;
&#13;
&#13;

好的,现在说我们要打印一个名单,显示将参加game的所有玩家......

const gamePlayers = game =>
  flatten (game)

gamePlayers (game)
// => [ [ 'bob', 5 ], [ 'alice', 6 ], [ 'ricky', 4 ], [ 'julian', 2 ] ]

如果我们的flatten程序也使嵌套数组变平,我们最终会得到这个垃圾结果...

const gamePlayers = game =>
  badGenericFlatten(game)

gamePlayers (game)
// => [ 'bob', 5, 'alice', 6, 'ricky', 4, 'julian', 2 ]

罗林&#39;深,宝贝

这并不是说有时候你也不想压扁嵌套数组 - 只是不应该是默认行为。

我们可以轻松制定deepFlatten程序......

&#13;
&#13;
// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.map(f).reduce(concat, [])

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)

// deepFlatten :: [[a]] -> [a]
const deepFlatten =
  concatMap (x =>
    Array.isArray (x) ? deepFlatten (x) : x)

// your sample data
const data =
  [0, [1, [2, [3, [4, 5], 6]]], [7, [8]], 9]

console.log (flatten (data))
// [ 0, 1, [ 2, [ 3, [ 4, 5 ], 6 ] ], 7, [ 8 ], 9 ]

console.log (deepFlatten (data))
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
&#13;
&#13;
&#13;

有。现在,每个作业都有一个工具 - 一个用于压缩一个嵌套级别flatten,另一个用于清除所有嵌套deepFlatten

如果您不喜欢名称obliterate,也许可以将其称为nukedeepFlatten

不要反复两次!

当然,上述实施方式既简洁又简洁,但使用.map后跟.reduce调用意味着我们实际上做的迭代超过了必要的次数

使用可靠的组合器我调用mapReduce有助于将迭代保持在最小值;它需要一个映射函数m :: a -> b,一个递减函数r :: (b,a) ->b并返回一个新的递减函数 - 这个组合器是换能器的核心;如果您有兴趣,I've written other answers about them

&#13;
&#13;
// mapReduce = (a -> b, (b,a) -> b, (b,a) -> b)
const mapReduce = (m,r) =>
  (acc,x) => r (acc, m (x))

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.reduce (mapReduce (f, concat), [])

// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)
  
// deepFlatten :: [[a]] -> [a]
const deepFlatten =
  concatMap (x =>
    Array.isArray (x) ? deepFlatten (x) : x)

// your sample data
const data =
  [ [ [ 1, 2 ],
      [ 3, 4 ] ],
    [ [ 5, 6 ],
      [ 7, 8 ] ] ]

console.log (flatten (data))
// [ [ 1. 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]

console.log (deepFlatten (data))
// [ 1, 2, 3, 4, 5, 6, 7, 8 ]
&#13;
&#13;
&#13;

答案 8 :(得分:37)

有一个名为flat的新的本机ECMA 2018方法可以准确地做到这一点。

const arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

答案 9 :(得分:30)

更一般情况的解决方案,当您的数组中可能包含一些非数组元素时。

function flattenArrayOfArrays(a, r){
    if(!r){ r = []}
    for(var i=0; i<a.length; i++){
        if(a[i].constructor == Array){
            r.concat(flattenArrayOfArrays(a[i], r));
        }else{
            r.push(a[i]);
        }
    }
    return r;
}

答案 10 :(得分:25)

使用reduce(callback[, initialValue])

JavaScript 1.8方法怎么样?
list.reduce((p,n) => p.concat(n),[]);

会做这个工作。

答案 11 :(得分:24)

要展平单个元素数组的数组,您不需要导入库,简单循环是最简单的most efficient解决方案:

for (var i = 0; i < a.length; i++) {
  a[i] = a[i][0];
}

对于downvoters:请阅读问题,不要因为它不适合你非常不同的问题而投票。对于问题,这个解决方案既是最快也最简单的。

答案 12 :(得分:22)

另一种功能风格的ECMAScript 6解决方案:

声明功能:

const flatten = arr => arr.reduce(
  (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
);

并使用它:

flatten( [1, [2,3], [4,[5,[6]]]] ) // -> [1,2,3,4,5,6]

<强>更新

还要考虑现代浏览器的最新版本中提供的本机函数Array.prototype.flat()(ES6提案)。

感谢@(КонстантинВан)和@(Mark Amery)在评论中提及它。

答案 13 :(得分:17)

const common = arr.reduce((a, b) => [...a, ...b], [])

答案 14 :(得分:14)

请注意:当使用Function.prototype.apply[].concat.apply([], arrays))或点差运算符([].concat(...arrays))来展平数组时,两者都会导致堆栈大数组溢出,因为函数的每个参数都存储在堆栈中。

这是一个功能样式的堆栈安全实现,它可以衡量彼此最重要的要求:

  • 可重用性
  • 可读性
  • 简明
  • 性能

// small, reusable auxiliary functions:

const foldl = f => acc => xs => xs.reduce(uncurry(f), acc); // aka reduce

const uncurry = f => (a, b) => f(a) (b);

const concat = xs => y => xs.concat(y);


// the actual function to flatten an array - a self-explanatory one-line:

const flatten = xs => foldl(concat) ([]) (xs);

// arbitrary array sizes (until the heap blows up :D)

const xs = [[1,2,3],[4,5,6],[7,8,9]];

console.log(flatten(xs));


// Deriving a recursive solution for deeply nested arrays is trivially now


// yet more small, reusable auxiliary functions:

const map = f => xs => xs.map(apply(f));

const apply = f => a => f(a);

const isArray = Array.isArray;


// the derived recursive function:

const flattenr = xs => flatten(map(x => isArray(x) ? flattenr(x) : x) (xs));

const ys = [1,[2,[3,[4,[5],6,],7],8],9];

console.log(flattenr(ys));

一旦习惯了咖喱形式,函数组合和高阶函数的小箭头函数,这段代码就像散文一样。然后编程只是将总是按预期工作的小构建块放在一起,因为它们不包含任何副作用。

答案 15 :(得分:10)

ES6 One Line Flatten

请参阅lodash flattenunderscore flatten (shallow true)

function flatten(arr) {
  return arr.reduce((acc, e) => acc.concat(e), []);
}

or

function flatten(arr) {
  return [].concat.apply([], arr);
}

使用

进行测试
test('already flatted', () => {
  expect(flatten([1, 2, 3, 4, 5])).toEqual([1, 2, 3, 4, 5]);
});

test('flats first level', () => {
  expect(flatten([1, [2, [3, [4]], 5]])).toEqual([1, 2, [3, [4]], 5]);
});

ES6 One Line Deep Flatten

请参阅lodash flattenDeepunderscore flatten

function flattenDeep(arr) {
  return arr.reduce((acc, e) => Array.isArray(e) ? acc.concat(flattenDeep(e)) : acc.concat(e), []);
}

使用

进行测试
test('already flatted', () => {
  expect(flattenDeep([1, 2, 3, 4, 5])).toEqual([1, 2, 3, 4, 5]);
});

test('flats', () => {
  expect(flattenDeep([1, [2, [3, [4]], 5]])).toEqual([1, 2, 3, 4, 5]);
});

答案 16 :(得分:9)

使用点差运算符:

const input = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];
const output = [].concat(...input);
console.log(output); // --> ["$6", "$12", "$25", "$25", "$18", "$22", "$10"]

答案 17 :(得分:7)

如果只有1个字符串元素的数组:

[["$6"], ["$12"], ["$25"], ["$25"]].join(',').split(',');

将完成这项工作。 Bt特别匹配您的代码示例。

答案 18 :(得分:7)

ES6方式:

const flatten = arr => arr.reduce((acc, next) => acc.concat(Array.isArray(next) ? flatten(next) : next), [])

const a = [1, [2, [3, [4, [5]]]]]
console.log(flatten(a))

针对N次嵌套数组的ES3回退的flatten函数的ES5方式:

var flatten = (function() {
  if (!!Array.prototype.reduce && !!Array.isArray) {
    return function(array) {
      return array.reduce(function(prev, next) {
        return prev.concat(Array.isArray(next) ? flatten(next) : next);
      }, []);
    };
  } else {
    return function(array) {
      var arr = [];
      var i = 0;
      var len = array.length;
      var target;

      for (; i < len; i++) {
        target = array[i];
        arr = arr.concat(
          (Object.prototype.toString.call(target) === '[object Array]') ? flatten(target) : target
        );
      }

      return arr;
    };
  }
}());

var a = [1, [2, [3, [4, [5]]]]];
console.log(flatten(a));

答案 19 :(得分:7)

var arrays = [["a"], ["b", "c"]];
Array.prototype.concat.apply([], arrays);

// gives ["a", "b", "c"]

(我只是根据@danhbear的评论将其作为一个单独的答案。)

答案 20 :(得分:6)

我宁愿将整个数组按原样转换为字符串,但与其他答案不同,它会使用JSON.stringify执行此操作而不使用toString()方法,这会产生不需要的结果。

使用JSON.stringify输出,剩下的就是删除所有括号,用start&amp; amp封装结果。再次结束括号,并用JSON.parse提供结果,将字符串带回“生命”。

  • 无需任何速度成本即可处理无限嵌套数组。
  • 可以正确处理包含逗号的字符串的数组项。

var arr = ["abc",[[[6]]],["3,4"],"2"];

var s = "[" + JSON.stringify(arr).replace(/\[|]/g,'') +"]";
var flattened = JSON.parse(s);

console.log(flattened)

  • 仅适用于多维数组字符串/数字(不是对象)

答案 21 :(得分:5)

我推荐节省空间的generator function

function* flatten(arr) {
  if (!Array.isArray(arr)) yield arr;
  else for (let el of arr) yield* flatten(el);
}

// Example:
console.log(...flatten([1,[2,[3,[4]]]])); // 1 2 3 4

如果需要,创建一个展平值数组,如下所示:

let flattened = [...flatten([1,[2,[3,[4]]]])]; // [1, 2, 3, 4]

答案 22 :(得分:5)

Haskellesque方法

function flatArray([x,...xs]){
  return x ? [...Array.isArray(x) ? flatArray(x) : [x], ...flatArray(xs)] : [];
}

var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10];
    fa = flatArray(na);
console.log(fa);

答案 23 :(得分:5)

我使用递归和闭包来完成它

function flatten(arr) {

  var temp = [];

  function recursiveFlatten(arr) { 
    for(var i = 0; i < arr.length; i++) {
      if(Array.isArray(arr[i])) {
        recursiveFlatten(arr[i]);
      } else {
        temp.push(arr[i]);
      }
    }
  }
  recursiveFlatten(arr);
  return temp;
}

答案 24 :(得分:5)

这是递归方式...

function flatten(arr){
    let newArray = [];
    for(let i=0; i< arr.length; i++){
        if(Array.isArray(arr[i])){
          newArray =  newArray.concat(flatten(arr[i]))
        }else{
          newArray.push(arr[i])
        }
    }
  return newArray; 
}

console.log(flatten([1, 2, 3, [4, 5] ])); // [1, 2, 3, 4, 5]
console.log(flatten([[[[1], [[[2]]], [[[[[[[3]]]]]]]]]]))  // [1,2,3]
console.log(flatten([[1],[2],[3]])) // [1,2,3]

答案 25 :(得分:5)

看起来这看起来像是RECURSION的工作!

  • 处理多个嵌套级别
  • 处理空数组和非数组参数
  • 没有变异
  • 不依赖于现代浏览器功能

<强>代码:

var flatten = function(toFlatten) {
  var isArray = Object.prototype.toString.call(toFlatten) === '[object Array]';

  if (isArray && toFlatten.length > 0) {
    var head = toFlatten[0];
    var tail = toFlatten.slice(1);

    return flatten(head).concat(flatten(tail));
  } else {
    return [].concat(toFlatten);
  }
};

<强>用法:

flatten([1,[2,3],4,[[5,6],7]]);
// Result: [1, 2, 3, 4, 5, 6, 7] 

答案 26 :(得分:5)

前几天我和ES6 Generators进行了混淆并写了this gist。其中包含......

{{fsol-app-btn icon='bullhorn' action="clicked" title='Notifications' route='index' num='3' color='yellow'}}

基本上我正在创建一个循环在原始输入数组上的生成器,如果找到一个数组,它会使用yield*运算符和递归来连续展平内部数组。如果该项目不是数组,则仅yields单个项目。然后使用ES6 Spread operator(又名splat运算符),我将生成器展平为一个新的数组实例。

我还没有测试过它的性能,但我认为它是使用生成器和yield *运算符的一个很好的简单例子。

但同样,我只是在玩弄,所以我确信有更多高效的方法可以做到这一点。

答案 27 :(得分:5)

没有lodash的最佳解决方案

let flatten = arr => [].concat.apply([], arr.map(item => Array.isArray(item) ? flatten(item) : item))

答案 28 :(得分:4)

这里的逻辑是将输入数组转换为字符串并删除所有括号([])并将输出解析为数组。我正在使用ES6模板功能。

var x=[1, 2, [3, 4, [5, 6,[7], 9],12, [12, 14]]];

var y=JSON.parse(`[${JSON.stringify(x).replace(/\[|]/g,'')}]`);

console.log(y)

答案 29 :(得分:4)

对于任何深度的嵌套数组,都可以将Array.flat()Infinity一起使用。

var arr = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]], [[1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]]] ];


let flatten = arr.flat(Infinity)

console.log(flatten)

在此处查看浏览器compatibility

答案 30 :(得分:4)

这并不难,只需迭代数组并合并它们:

var result = [], input = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"]];

for (var i = 0; i < input.length; ++i) {
    result = result.concat(input[i]);
}

答案 31 :(得分:3)

有两种方法可以让你的数组变平

*1-第一个你可以使用 Array.prototype.flat 方法

const veryDeep = [[1, [2, 2, [3, [4, [5, [6]]]]], 1]];

veryDeep.flat(Infinity)
 // [1, 2, 2, 3, 4, 5, 6, 1]
 /**  If you don't know the depth of the array, 
simply pass Infinity **\

或者,如果您知道数组嵌套了多少,则可以输入参数

const twoLevelsDeep = [[1, [2, 2], 1]];
//depth = 1
twoLevelsDeep.flat();
[1, [2, 2], 1]

//depth = 2
twoLevelsDeep.flat(2);
// [1, 2, 2, 1]

enter image description here

*第二种方法可以通过在 ES6 中使用扩展运算符来扁平化你的数组,并且 Concat 它将扁平化你的数组,不管它有多少嵌套

 const multidimension = [?, [?, ?, ?], ?, [?, ?]];

   [].concat(...multidimension); // This will return: [?, ?, ?, ?, ?, ?, 
   ?]

   const multidimension = [1, [2, 3, 4], 5, [6, 7]];

   [].concat(...multidimension); // This will return: [1, 2, 3, 4, 5, 6, 7]

答案 32 :(得分:3)

我提出了两个没有递归的简短解决方案。从计算复杂性的角度来看,它们并不是最优的,但在平均情况下工作正常:

let a = [1, [2, 3], [[4], 5, 6], 7, 8, [9, [[10]]]];

// Solution #1
while (a.find(x => Array.isArray(x)))
    a = a.reduce((x, y) => x.concat(y), []);

// Solution #2
let i = a.findIndex(x => Array.isArray(x));
while (i > -1)
{
    a.splice(i, 1, ...a[i]);
    i = a.findIndex(x => Array.isArray(x));
}

答案 33 :(得分:3)

const flatten = array => array.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []); 

根据请求,分解一行基本上就是这个。

function flatten(array) {
  // reduce traverses the array and we return the result
  return array.reduce(function(acc, b) {
     // if is an array we use recursion to perform the same operations over the array we found 
     // else we just concat the element to the accumulator
     return acc.concat( Array.isArray(b) ? flatten(b) : b);
  }, []); // we initialize the accumulator on an empty array to collect all the elements
}

答案 34 :(得分:3)

我认为array.flat(Infinity)是一个完美的解决方案。但是扁平函数是一个相对较新的函数,可能无法在旧版浏览器中运行。我们可以使用递归函数来解决这个问题。

const arr = ["A", ["B", [["B11", "B12", ["B131", "B132"]], "B2"]], "C", ["D", "E", "F", ["G", "H", "I"]]]
const flatArray = (arr) => {
    const res = []
    for (const item of arr) {
        if (Array.isArray(item)) {
            const subRes = flatArray(item)
            res.push(...subRes)
        } else {
            res.push(item)
        }
    }

    return res
}

console.log(flatArray(arr))

答案 35 :(得分:3)

现在,最好和最简单的方法就是像这样加入和分割数组。

var checkArray = ["portfolio-item", "if AnyOther Thing Too can come here"];
for(var i=0; i<checkArray.length; i++) {
    $('a[href*="'+checkArray[i]+'"]').attr('href', "#");
}

此解决方案适用于多个级别,也是oneliner。

DEMO

编辑ECMAScript 6

由于ECMAScript 6已标准化,您可以更改var multipleArrays = [["$6","$Demo"], ["$12",["Multi","Deep"]], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]] var flattened = multipleArrays.join().split(",") 的操作[].concat.apply([], arrays);

[].concat(...arrays);

DEMO

编辑最有效的解决方案

解决问题的最有效方法是使用循环。您可以比较“ops / sec”速度here

var flattened = [].concat(...input);

DEMO

希望它有助于

答案 36 :(得分:2)

在Node环境中,如果您的版本不支持Array.prototype.flat,但您使用的是es6或ts,则可以这样做

const arrays = [
  ["$6"],
  ["$12"],
  ["$25"],
  ["$25"],
  ["$18"],
  ["$22"],
  ["$10"]
];
const merged = [].concat(...arrays);

console.log(merged);

答案 37 :(得分:2)

这是现代浏览器的另一个深度扁平化:

function flatten(xs) {
  xs = Array.prototype.concat.apply([], xs);
  return xs.some(Array.isArray) ? flatten(xs) : xs;
};

答案 38 :(得分:2)

如果你的数组只包含整数或字符串,你可以使用这个脏黑客:

var arr = [345,2,[34],2,[524,[5456]],[5456]];
var flat = arr.toString().split(',');

Works,在FF,IE和Chrome中还没有测试其他浏览器。

答案 39 :(得分:2)

要在一行中展平二维数组:

[[1, 2], [3, 4, 5]].reduce(Function.prototype.apply.bind(Array.prototype.concat))
// => [ 1, 2, 3, 4, 5 ]

答案 40 :(得分:2)

我知道这很hacky,但我必须简洁的方法来展平一个数组(任何深度!)的字符串(没有逗号!)是将数组转换为字符串然后拆分字符串逗号:

var myArray =[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]];
var myFlatArray = myArray.toString().split(',');

myFlatArray;
// ["$6", "$12", "$25", "$25", "$18", "$22", "$10", "$0", "$15", "$3", "$75", "$5", "$100", "$7", "$3", "$75", "$5"]

这应该适用于任何深度的嵌套数组,只包含字符串和数字(​​整数和浮点数),但需要注意的是数字将在过程中转换为字符串。这可以通过一点映射来解决:

var myArray =[[[1,2],[3,4]],[[5,6],[7,8]],[[9,0]]];
var myFlatArray = myArray.toString().split(',').map(function(e) { return parseInt(e); });
myFlatArray;
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

答案 41 :(得分:2)

/**
* flatten an array first level
* @method flatten
* @param array {Array}
* @return {Array} flatten array
*/
function flatten(array) {
  return array.reduce((acc, current) => acc.concat(current), []);
}


/**
* flatten an array recursively
* @method flattenDeep
* @param array {Array}
* @return {Array} flatten array
*/
function flattenDeep(array) {
  return array.reduce((acc, current) => {
    return Array.isArray(current) ? acc.concat(flattenDeep(current)) : acc.concat([current]);
  }, []);
}

/**
* flatten an array recursively limited by depth
* @method flattenDepth
* @param array {Array}
* @return {Array} flatten array
*/
function flattenDepth(array, depth) {
  if (depth === 0) {
    return array;
  }
  return array.reduce((acc, current) => {
    return Array.isArray(current) ? acc.concat(flattenDepth(current, --depth)) : acc.concat([current]);
  }, []);
}

答案 42 :(得分:2)

只需使用扩展运算符,我们就可以按以下方式展平。

var OriginalArray = [[5, 1], [6], [2], [8]];
var newArray = [];

for (let i = 0; i < OriginalArray.length; i++) {
  newArray.push(...OriginalArray[i]);
}

console.log(newArray)

答案 43 :(得分:2)

最好以递归的方式进行操作,因此,如果另一个数组中还有另一个数组,则可以轻松地过滤 ...

const flattenArray = arr =>
  arr.reduce(
    (res, cur) =>
       !Array.isArray(cur) 
       ? res.concat(cur)
       : res.concat(flattenArray(cur)), []);

您可以这样称呼它:

flattenArray([[["Alireza"], "Dezfoolian"], ["is a"], ["developer"], [[1, [2, 3], ["!"]]]);

,结果如下:

["Alireza", "Dezfoolian", "is a", "developer", 1, 2, 3, "!"]

答案 44 :(得分:2)

这是基于artif3x答案的Typescript版本,为Scala粉丝提供了flatMap的额外实现。

function flatten<T>(items: T[][]): T[] {
  return items.reduce((prev, next) => prev.concat(next), []);
}

function flatMap<T, U>(items: T[], f: (t: T) => U[]): U[] {
  return items.reduce((prev, next) => prev.concat(f(next)), new Array<U>());
}

答案 45 :(得分:1)

您可以使用Array.prototype.reduce()Array.prototype.concat()

展平数组数组

&#13;
&#13;
var data = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]].reduce(function(a, b) {
  return a.concat(b);
}, []);
console.log(data);
&#13;
&#13;
&#13;

相关文档: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

答案 46 :(得分:1)

此解决方案适用于数组的任何深度级别(指定嵌套数组结构应有多深)。

function flatten(obj) {
    var out = [];
    function cleanElements(input) {
        for (var i  in input){
            if (input[i]instanceof Array){
                cleanElements(input[i]);
            }
            else {
                out.push(input[i]);
            }
        }
    }
    cleanElements(obj);
    return (out);
}

答案 47 :(得分:1)

在JavaScript中定义一个称为foo的数组,并使用javascript的array concat内置方法将该数组展平为单个数组:

const foo = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]] 
console.log({foo}); 

const bar = [].concat(...foo) 
console.log({bar});

应打印:

{ foo: 
   [ [ '$6' ],
     [ '$12' ],
     [ '$25' ],
     [ '$25' ],
     [ '$18' ],
     [ '$22' ],
     [ '$10' ] ] }
{ bar: [ '$6', '$12', '$25', '$25', '$18', '$22', '$10' ] }

答案 48 :(得分:1)

我只用ES6回答了这个问题,假设深度数组是:

const deepArray = ['1',[['a'],['b']],[2],[[[['4',[3,'c']]]],[5]]];

如果您知道或猜测数组的深度不超过7之类的数字,请使用以下代码:

const flatArray = deepArray.flat(7);

但是,如果您不知道深度数组的深度,或者您的JavaScript引擎不像flat react-native那样支持JavaScriptCore,请使用下面的函数使用了JavaScript reduce函数:

 const deepFlatten = arr =>
         arr.reduce(
           (acc, val) =>
             Array.isArray(val) 
               ? acc.concat(deepFlatten(val)) 
               : acc.concat(val),
             []
         );

这两种方法都返回以下结果:

["1", "a", "b", 2, "4", 3, "c", 5]

答案 49 :(得分:1)

private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
   if (Persons.ItemContainerGenerator.Status == System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
   {
       int index = Persons.SelectedIndex;
       if (index >= 0)
           ((ListViewItem)Persons.ItemContainerGenerator.ContainerFromIndex(index)).Focus();
   }
}

答案 50 :(得分:1)

只需添加到出色的解决方案中即可。我用递归来解决这个问题。

            const flattenArray = () => {
                let result = [];
                return function flat(arr) {
                    for (let i = 0; i < arr.length; i++) {
                        if (!Array.isArray(arr[i])) {
                            result.push(arr[i]);
                        } else {
                            flat(arr[i])
                        }
                    }
                    return result;
                }
            }

测试结果:https://codepen.io/ashermike/pen/mKZrWK

答案 51 :(得分:1)

您还可以尝试新的Array.Flat()方法。它以以下方式工作:

let arr = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]].flat()

console.log(arr);

flat()方法创建一个新数组,其中所有子数组元素都以递归方式连接到其中,直到深度为1层(即数组内部的数组)

如果您还希望展平3维或什至更高维的数组,则只需多次调用flat方法。例如(3个维度):

let arr = [1,2,[3,4,[5,6]]].flat().flat().flat();

console.log(arr);

小心!

Array.Flat()方法相对较新。较旧的浏览器(例如ie)可能尚未实现该方法。如果您希望代码在所有浏览器上都能工作,则可能必须将JS转换为旧版本。检查MD Web文档是否具有当前浏览器兼容性。

答案 52 :(得分:1)

递归调用deepFlatten函数,这样我们就可以在不使用任何外部辅助方法的情况下扩展内部数组。

const innerArr = ['a', 'b'];
const multiDimArr = [[1, 2], 3, 4, [5, 6, innerArr], 9];

const deepFlatten = (arr) => {
  const flatList = [];
  arr.forEach(item => {
    Array.isArray(item)
     ? flatList.push(...deepFlatten(item)) // recursive call
     : flatList.push(item)
  });
  return flatList;
}

答案 53 :(得分:1)

您可以使用 Ramda JS flatten

&#13;
&#13;
var arr = [[1,2], [3], [4,5]];
var flattenedArray = R.flatten(arr); 

console.log(flattenedArray)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
&#13;
&#13;
&#13;

答案 54 :(得分:1)

使用此方法可以平整两个数组

arr1.concat(...arr2);

答案 55 :(得分:1)

以下代码将展平深层嵌套数组:

/**
 * [Function to flatten deeply nested array]
 * @param  {[type]} arr          [The array to be flattened]
 * @param  {[type]} flattenedArr [The flattened array]
 * @return {[type]}              [The flattened array]
 */
function flattenDeepArray(arr, flattenedArr) {
  let length = arr.length;

  for(let i = 0; i < length; i++) {
    if(Array.isArray(arr[i])) {
      flattenDeepArray(arr[i], flattenedArr);
    } else {
      flattenedArr.push(arr[i]);
    }
  }

  return flattenedArr;
}

let arr = [1, 2, [3, 4, 5], [6, 7]];

console.log(arr, '=>', flattenDeepArray(arr, [])); // [ 1, 2, [ 3, 4, 5 ], [ 6, 7 ] ] '=>' [ 1, 2, 3, 4, 5, 6, 7 ]

arr = [1, 2, [3, 4], [5, 6, [7, 8, [9, 10]]]];

console.log(arr, '=>', flattenDeepArray(arr, [])); // [ 1, 2, [ 3, 4 ], [ 5, 6, [ 7, 8, [Object] ] ] ] '=>' [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

答案 56 :(得分:1)

比使用顶部答案中列出的merge.concat.apply()方法更快的方法,更快,我的意思是超过几个数量级更快。这假设您的环境可以访问ES5阵列方法。

var array2d = [
  ["foo", "bar"],
  ["baz", "biz"]
];
merged = array2d.reduce(function(prev, next) {
    return prev.concat(next);
});

这里是jsperf链接:http://jsperf.com/2-dimensional-array-merge

答案 57 :(得分:1)

function flatten(input) {
  let result = [];
  
  function extractArrayElements(input) {
    for(let i = 0; i < input.length; i++){
      if(Array.isArray(input[i])){
        extractArrayElements(input[i]);
      }else{
        result.push(input[i]);
      }
    }
  }
  
  extractArrayElements(input);
  
  return result;
}


// let input = [1,2,3,[4,5,[44,7,8,9]]];
// console.log(flatten(input));

// output [1,2,3,4,5,6,7,8,9]

答案 58 :(得分:1)

这是 Typescript 中最快的解决方案,它也可用于具有多层嵌套的数组:

export function flatten<T>(input: Array<any>, output: Array<T> = []): Array<T> {
    for (const value of input) {
        Array.isArray(value) ? flatten(value, output) : output.push(value);
    }
    return output;
}

和:

const result = flatten<MyModel>(await Promise.all(promises));

答案 59 :(得分:1)

适用于所有数据类型的递归版本

 /*jshint esversion: 6 */

// nested array for testing
let nestedArray = ["firstlevel", 32, "alsofirst", ["secondlevel", 456,"thirdlevel", ["theinnerinner", 345, {firstName: "Donald", lastName: "Duck"}, "lastinner"]]];

// wrapper function to protect inner variable tempArray from global scope;
function flattenArray(arr) {

  let tempArray = [];

  function flatten(arr) {
    arr.forEach(function(element) {
      Array.isArray(element) ? flatten(element) : tempArray.push(element);     // ternary check that calls flatten() again if element is an array, hereby making flatten() recursive.
    });
  }

  // calling the inner flatten function, and then returning the temporary array
  flatten(arr);
  return tempArray;
}

// example usage:
let flatArray = flattenArray(nestedArray);

答案 60 :(得分:1)

我只是尝试在不使用任何内置函数的情况下解决问题。

var arr = [1, 3, 4, 65, [3, 5, 6, 9, [354, 5, 43, 54, 54, 6, [232, 323, 323]]]];
var result = [];

function getSingleArray(inArr) {
  for (var i = 0; i < inArr.length; i++) {
    if (typeof inArr[i] == "object") {
      getSingleArray(inArr[i]); // Calling Recursively
    } else {
      result.push(inArr[i]);
    }
  }
}

getSingleArray(arr);
console.log(result); // [1, 3, 4, 65, 3, 5, 6, 9, 354, 5, 43, 54, 54, 6, 232, 323, 323]

答案 61 :(得分:1)

我原本以为使用.reduce方法并递归调用函数来展平内部数组,但是当您使用深层嵌套数组的深层嵌套数组时,这会导致堆栈溢出。使用concat也不是最好的方法,因为每次迭代都会创建一个新的数组浅表副本。我们可以做的是:

const flatten = arr => {
    for(let i = 0; i < arr.length;) {
        const val = arr[i];
        if(Array.isArray(val)) {
            arr.splice(i, 1, ...val);
        } else {
            i ++;
        }
    }
    return arr;
}

我们不是通过concat创建新数组,而是我们不会递归调用任何函数。

http://jsbin.com/firiru/4/edit?js,console

答案 62 :(得分:0)

ES-Next解决方案

  1. Array.from /设置/ Array.flat / Array.sort
// 1. remove duplicate item
// 2. flat array
let arr= [["$6", ["$18"]], ["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];

let result = Array.from(new Set(arr.flat(Infinity)));

console.log(`flat array with unique filter`, result);
// 

// 1. remove duplicate item
// 2. sort by Asc order (munber only)
// 3. flat array

// let arr= [["$6", ["$18"]], ["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];

let arr= [["6", ["18"]], ["6"], ["12"], ["25"], ["25"], ["18"], ["22"], ["10"]];

let result = Array.from(new Set(arr.flat(Infinity))).map(Number).sort((a,b)=> a > b ? 1: -1);

console.log(`flat array with unique filter & Asc sort`, result);
//

  1. ...传播/设置/ Array.flat / Array.sort
// 1. remove duplicate item
// 2. flat array
let arr= [["$6", ["$18"]], ["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];

let result = [...new Set(arr.flat(Infinity))];

console.log(`flat array with unique filter`, result);
// 

// 1. remove duplicate item
// 2. sort by Asc order(number only)
// 3. flat array

//let arr= [["$6", ["$18"]], ["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];

let arr= [["6", ["18"]], ["6"], ["12"], ["25"], ["25"], ["18"], ["22"], ["10"]];

let result = [...new Set(arr.flat(Infinity))].map(Number).sort((a,b)=> a > b ? 1: -1);

console.log(`flat array with unique filter & Asc sort`, result);
// 

裁判

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

答案 63 :(得分:0)

我编写的简单的util

const flatten = (arr, result = []) => {
    if (!Array.isArray(arr)){
        return [...result, arr];
    }
     arr.forEach((a) => {
         result = flatten(a, result)
    })

    return result
}

console.log(flatten([1,[2,3], [4,[5,6,[7,8]]]])) // [ 1, 2, 3, 4, 5, 6, 7, 8 ]

答案 64 :(得分:0)

由于ES2019引入了flat和flatMap,因此可以对任何数组进行flat操作,如下所示:

const myArr = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]
const myArrFlat= myArr.flat(Infinity);
console.log(myArrFlat); // ["$6", "$12", "$25", ...]

参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

答案 65 :(得分:0)

更简单直接。可以选择深压;

const flatReduce = (arr, deep) => {
    return arr.reduce((acc, cur) => {
        return acc.concat(Array.isArray(cur) && deep ? flatReduce(cur, deep) : cur);
    }, []);
};

console.log(flatReduce([1, 2, [3], [4, [5]]], false)); // =>  1,2,3,4,[5]
console.log(flatReduce([1, 2, [3], [4, [5, [6, 7, 8]]]], true)); // => 1,2,3,4,5,6,7,8

答案 66 :(得分:0)

使用单行代码即可解决此问题。

function unflatten(arr){
    return arr.reduce((prevProps, nextProps) => {
        return prevProps.concat(Array.isArray(nextProps) ? unflatten(nextProps) : nextProps)
    }, [])
}

https://codepen.io/jyotishman/pen/BayVeoQ

答案 67 :(得分:0)

[1,[2,3],[4,[5,6]]].reduce(function(p, c) {
    return p.concat(c instanceof Array ? 
                    c.reduce(arguments.callee, []) : 
                    [c]); 
}, []);

答案 68 :(得分:0)

另一种使用jQuery $ .map()函数的方法。 来自jQuery文档:

该函数可以返回一个值数组,该值将被展平为整个数组。

var source = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];
var target = $.map(source, function(value) { return value; }); // ["$6", "$12", "$25", "$25", "$18", "$22", "$10"]

答案 69 :(得分:0)

这是使用堆栈进行非递归展平深度的解决方案。

    function flatten(input) {
        const stack = [...input];
        const res = [];
        while (stack.length) {
            const next = stack.pop();
            if (Array.isArray(next)) {
                stack.push(...next);
            } else {
                res.push(next);
            }
        }
        return res.reverse();
    }
    const arrays = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];
    flatten(arrays);

答案 70 :(得分:0)

使用arrays.flat();

 var arrays = [
  ["$6"],
  ["$12"],
  ["$25"],
  ["$25"],
  ["$18"],
  ["$22"],
  ["$10"]
];
arrays.flat();

答案 71 :(得分:0)

ES6的纯粹魔力

const flat = A => A.reduce((A, a) => Array.isArray(a) ? [...A, ...flat(a)] : [...A, a], []);

答案 72 :(得分:0)

制作扁平数组的方法

  • 使用Es6 flat()
  • 使用Es6 reduce()
  • 使用递归
  • 使用字符串操作

[1,[2,[3,[4,[5,[6,7,8],9],10]]]-[1、2、3、4、5、6、7 8、9、10]

// using Es6 flat() 
let arr = [1,[2,[3,[4,[5,[6,7],8],9],10]]]
console.log(arr.flat(Infinity))

// using Es6 reduce()
let flatIt = (array) => array.reduce(
  (x, y) => x.concat(Array.isArray(y) ? flatIt(y) : y), []
)
console.log(flatIt(arr))

// using recursion
function myFlat(array) {
  let flat = [].concat(...array);
  return flat.some(Array.isArray) ? myFlat(flat) : flat;
}
console.log(myFlat(arr));

// using string manipulation
let strArr = arr.toString().split(','); 
for(let i=0;i<strArr.length;i++)
  strArr[i]=parseInt(strArr[i]);

console.log(strArr)

答案 73 :(得分:0)

这是我的版本。它允许您展平可在更多场景中使用的复杂对象:

<强>输入

var input = {
   a: 'asdf',
   b: [1,2,3],
   c: [[1,2],[3,4]],
   d: {subA: [1,2]}
}

<强>代码

功能如下:

function flatten (input, output) {

  if (isArray(input)) {
    for(var index = 0, length = input.length; index < length; index++){
      flatten(input[index], output);
    }
  }
  else if (isObject(input)) {
    for(var item in input){
      if(input.hasOwnProperty(item)){
        flatten(input[item], output);
      }
    }
  }
  else {
    return output.push(input);
  }
};

function isArray(obj) {
  return Array.isArray(obj) || obj.toString() === '[object Array]';
}

function isObject(obj) {
  return obj === Object(obj);
}

用法

var output = []

flatten(input, output);

<强>输出

[“asdf”,1,2,3,1,2,3,4,1,2]

答案 74 :(得分:0)

我有一个简单的解决方案,无需使用特殊的js函数。 (如减少等)

g(x)

答案 75 :(得分:0)

对于 Scala 用户,他们正在寻找一种在Javascript中复制 Seq.flatten 的方式,下面是Array的皮条客:< / p>

Array.prototype.flatten = function() {
  return [].concat.apply([], this);
};

可通过以下方式使用:

[[12, 3, 5], [1], [], [3, 4]].flatten() // [12, 3, 5, 1, 3, 4]

答案 76 :(得分:0)

尝试此方法,

arr = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]
concat_arr = arr.concat.apply([], arr)
console.log(concat_arr)

答案 77 :(得分:0)

如果使用lodash,则可以使用其flatten方法:https://lodash.com/docs/4.17.14#flatten

关于lodash的好处是,它还具有展平数组的方法:

i)递归:https://lodash.com/docs/4.17.14#flattenDeep

ii)最多n个嵌套级别:https://lodash.com/docs/4.17.14#flattenDepth

答案 78 :(得分:0)

Array.prototype.flatten = Array.prototype.flatten || function() {
    return [].reduce.call(this, function(flat, toFlatten) {
        return flat.concat(Array.isArray(toFlatten) ? toFlatten.flatten() : toFlatten);
    },[])
};

答案 79 :(得分:0)

    $scope.onSwipeRight = function(tab_num){
        if( tab_num < 0){
            return;
        }
        $scope.selectedIndex = tab_num;   
    }

    $scope.onSwipeLeft = function(tab_num){
        if( tab_num > l){
        //l is number of tabs I have
            return;
        }
        $scope.selectedIndex = tab_num;        
    }

答案 80 :(得分:0)

如果你需要支持IE8,因此不能使用reduce或isArray等方法,这里有一个可能的解决方案。这是一种冗长的方法,可以帮助您理解递归算法。

function flattenArray(a){

    var aFinal = [];

    (function recursiveArray(a){

        var i,
            iCount = a.length;

        if (Object.prototype.toString.call(a) === '[object Array]') {
            for (i = 0; i < iCount; i += 1){
                recursiveArray(a[i]);
            }
        } else {
            aFinal.push(a);
        }

    })(a);

    return aFinal;

}

var aMyArray = [6,3,4,[12,14,15,[23,24,25,[34,35],27,28],56],3,4];

var result = flattenArray(aMyArray);

console.log(result);

答案 81 :(得分:0)

当扁平化不深时,我没有在这里找到大型阵列的解决方案。所以,我的版本:

function flatten(arr){
    result = []
    for (e of arr)
        result.push(...e)
    return result
}

答案 82 :(得分:-1)

深度扁平&amp;面向对象?

[23, [34, 454], 12, 34].flatten();
// -->   [23,34, 454, 12, 34]

[23, [34, 454,[66,55]], 12, 34].flatten();

// -->  [23, 34, 454, [66,55], 12, 34]

DEEP Flatten:

[23, [34, 454,[66,55]], 12, 34].flatten(true);

// --> [23, 34, 454, 66, 55, 12, 34]

DEMO

CDN


如果所有数组元素都是Integer,Float,...或/和String,那么就这样做吧:

var myarr=[1,[7,[9.2]],[3],90];
eval('myarr=['+myarr.toString()+']');
print(myarr);
// [1, 7, 9.2, 3, 90]

DEMO

答案 83 :(得分:-1)

我知道这个问题有非常受欢迎的答案但是这个es6的递归函数很简单我想。

    const recsiveFlatten = (complexArray) => {
     return complexArray.reduce((ArrayMember, initial) => initial.constructor === Array ? ArrayMember.concat(recsiveFlatten(initial)) : ArrayMember.concat(initial), []);
     }

     let ComplexArray = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]

     console.log(recsiveFlatten(ComplexArray)) // [ '$6', '$12', '$25', '$25', '$18', '$22', '$10' ]

答案 84 :(得分:-2)

  1. 这可以在行代码中完成:join()和split()
  2. 对于深层嵌套数组也是如此。
  3. &#13;
    &#13;
     let arr = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];
            arr.join().split(',') //["$6", "$12", "$25", "$25", "$18", "$22", "$10"]
    &#13;
    &#13;
    &#13;

答案 85 :(得分:-2)

假设您的数组数组存储在obj中。 我们将最终输出存储在obj1中。

javascript中的简单方法是:

for(var i=0;i<obj.length;i++) 
  for(var j =0;j<obj[i].length;j++) 
    obj1.push(obj[i][j]);

以下是节点控制台上的代码输出。

> var obj=[];
undefined

> obj=[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]]
[ [ '$6' ],
  [ '$12' ],
  [ '$25' ],
  [ '$25' ],
  [ '$18' ],
  [ '$22' ],
  [ '$10' ],
  [ '$0' ],
  [ '$15' ],
  [ '$3' ],
  [ '$75' ],
  [ '$5' ],
  [ '$100' ],
  [ '$7' ],
  [ '$3' ],
  [ '$75' ],
  [ '$5' ] ]

> var obj1=[];
undefined

> for(var i=0;i<obj.length;i++) for(var j =0;j<obj[i].length;j++) obj1.push(obj[i][j]);
17

> obj1
[ '$6',
  '$12',
  '$25',
  '$25',
  '$18',
  '$22',
  '$10',
  '$0',
  '$15',
  '$3',
  '$75',
  '$5',
  '$100',
  '$7',
  '$3',
  '$75',
  '$5' ]
> 

答案 86 :(得分:-2)

我认为最好的方法就是这样:

var flatten = function () {
  return [].slice.call(arguments).toString().split(',');
};

答案 87 :(得分:-3)

使用there中的代码。

我会写:

myArray.enumerable().selectMany(function(x) { return x; }).array()

答案 88 :(得分:-3)

我只是在寻找更快更简单的解决方案,为什么?因为我把这作为一个面试问题,我很好奇,所以我做了这个:

function flattenArrayOfArrays(a, r){
    if(!r){ r = []}
    for(var i=0; i<a.length; i++){
        if(a[i].constructor == Array){
            flattenArrayOfArrays(a[i], r);
        }else{
            r.push(a[i]);
        }
    }
    return r;
}

var i = [[1,2,[3]],4,[2,3,4,[4,[5]]]], output;

// Start timing now
console.time("flatten");
output = new Array(JSON.stringify(i).replace(/[^\w\s,]/g,"")); 
output
// ... and stop.
console.timeEnd("flatten");

// Start timing now
console.time("flatten2");
output = [].concat.apply([], i)
output
// ... and stop.
console.timeEnd("flatten2");

// Start timing now
console.time("flatten3");
output = flattenArrayOfArrays(i)
output
// ... and stop.
console.timeEnd("flatten3");

我在这里使用了最流行的答案和我的解决方案。我想有人会发现这很有趣。干杯!

答案 89 :(得分:-4)

试试这个:

var arrays = [[“$ 6”],[“$ 12”],[“$ 25”],[“$ 25”],[“$ 18”],[“$ 22”],[“$ 10”]];

var data = [] .concat.apply([],arrays);

var finalresults = [] .concat([“$ 6”],[“$ 12”],[“$ 25”],[“$ 25”],[“$ 18”],[“$ 22”],[“$ 10 “]);