我有一个JavaScript数组,如:

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

如何将单独的内部数组合并为一个,例如:

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

当前回答

您可以使用Undercore:

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

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

其他回答

这里有一个简短的函数,它使用一些较新的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]

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

有了JSON.stringify输出,剩下的就是删除所有括号,再次用开始和结束括号包装结果,并用JSON.parse提供结果,使字符串恢复“生命”。

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

var arr=[“abc”,[[[6],[“3,4”],“2”];var s=“[”+JSON.stringify(arr).replace(/\[|]/g,'')+“]”;var flatted=JSON.parse(s);console.log(展平)

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

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
}

深度扁平化和面向对象怎么样?

[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]

深压平:

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

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

DEMO

CDN


如果所有数组元素都是Integer、Float,。。。或/和字符串,所以只需执行以下操作:

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

DEMO

有一个令人困惑的隐藏方法,它在不改变原始数组的情况下构造一个新数组:

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