You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
By clicking “Sign up for GitHub”, you agree to our
terms of service
and
privacy statement
. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
function
flatten
(
arr
)
{
let
result
=
[
]
for
(
let
i
=
0
;
i
<
arr
.
length
;
i
++
)
{
if
(
Array
.
isArray
(
arr
[
i
]
)
)
{
result
=
result
.
concat
(
flatten
(
arr
[
i
]
)
)
}
else
{
result
.
push
(
arr
[
i
]
)
return
result
reduce
既然是对数组进行处理,最终返回一个值,我们就可以考虑使用 reduce 来简化代码:
// 2. 借助 reduce
function flatten(arr) {
return arr.reduce((acc, cur) => {
return acc.concat(Array.isArray(cur) ? flatten(cur) : cur)
}, [])
借助 apply/call
// 3. 借助 apply/call
function flatten(arr) {
while(arr.some(res => Array.isArray(res))) {
arr = Function.apply.call([].concat, [], arr)
return arr
扩展运算符
ES6 增加了扩展运算符,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中:
// 4. ES6 拓展运算符
function flatten(arr) {
while(arr.some(res => Array.isArray(res))) {
arr = [].concat(...arr) }
return arr
ES6的flat
ES6 为数组实例新增了 flat 方法,用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数组没有影响。
flat 默认只会 “拉平” 一层,如果想要 “拉平” 多层的嵌套数组,需要给 flat 传递一个整数,表示想要拉平的层数。
使用 Infinity 作为深度,展开任意深度的嵌套数组。
// 5. ES6 flat 方法
[1, 2, [3, , [4, 5]]].flat(Infinity)
两次循环遍历
时间复杂度是O(n^2),如果数组长度很大,那么将会非常耗费内存
直接使用for:
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
let res = [arr[0]]
for (let i = 1; i < arr.length; i++) {
let flag = true
for (let j = 0; j < res.length; j++) {
if (arr[i] === res[j]) {
flag = false;
break
if (flag) {
res.push(arr[i])
return res
使用 indexOf:
function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (result.indexOf(arry[i]) === -1) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
return result;
使用 includes:
function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (!result.includes(arry[i])) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
return result;
使用 reduce:
用reduce可以写的比较简洁
function uniq(arry) {
return arry.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
排序后去重
排序后比较相邻元素,不算排序,只需要遍历一次数组
function unique(arr) {
if (!Array.isArray(arr)) {
console.log('type error!')
return
arr = arr.sort()
let res = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] !== arr[i-1]) {
res.push(arr[i])
return res
ES6的Set、Map
空间换时间的做法
使用 Set:
// 解构赋值
function uniq(arry) {
return [...new Set(arry)];
// Array.from方法可以将Set结构转换为数组结果
function uniq(arry) {
return Array.from(new Set(arry));
使用 Map: