How to use JavaScript to convert an Array like [, 3, [, [], [[[8], 8? The legendary Array Flatten.
To solve this problem, we usually need Recursion to let the program loop by itself according to an algorithm. A book says, "recursion is a powerful programming technology." Well, she is not just JavaScript. Recursion can be difficult or simple (it is still difficult in general ). It should be appropriate to solve the above problem with recursion. This is a simple example of recursive use:
Copy codeThe Code is as follows:
Flatten: function (ac ){
Var array = [];
Var group = this. arr;
If (ac) group = ac;
For (var I = 0; I <group. length; I ++ ){
If (group [I] instanceof Array ){
Array = array. concat (this. flatten (group [I]);
} Else {
Array = array. concat (group [I]);
}
}
Return array;
}
If (group [I] instanceof Array), call the function itself and perform recursion by passing parameters. Just when refactoring Array. js, I thought that since it was a framework, there were so many abstract things that were not needed. Isn't it a waste. Therefore, it is best to call static functions that have already been abstracted, rather than repeat them again. Here there is a for loop, that is, we need to have each. What are the results? It is hard to implement it. Because we always need to create an array, and finally return the new array, We have to extract a function to call it again. This does not violate the original intention?
After a glance on the internet, I finally stared at prototype. His implementation method is to abstract a function for processing recursive increments and use this function for recursion. What should I do? This is called a framework. The following is a recursive function:
Copy codeThe Code is as follows:
Function inject (memo, iterator, context ){
This. each (function (value, index ){
Memo = iterator. call (context, memo, value, index );
});
Return memo;
}
The final implementation of this flatten function is as follows. The code is really beautiful:
Copy codeThe Code is as follows:
Function flatten (){
Return this. inject ([], function (array, value ){
If (Object. isArray (value ))
Return array. concat (value. flatten ());
Array. push (value );
Return array;
});
}
Of course, another abstract function is needed to process the for loop, which is our each function. Take this each function out of flatten and learn jQuery's practices and add native support. Of course, you can also process pure objects, not just Arrays:
Copy codeThe Code is as follows:
Each: function (callback, bind ){
Var isObject = arale. typeOf (this. obj) = 'object ',
I = 0,
Key;
If (isObject ){
Var obj = this. obj;
For (key in obj ){
If (callback. call (bind, key, obj [key]) === false ){
Break;
}
}
} Else {
Var arr = this. obj;
If (Array. prototype. forEach ){
// When the user returns false, the execution will continue.
// Native is very awesome. Do you want to go or share it? Marked TODO;
Return []. forEach. call (arr, callback, bind );
};
For (var value = arr [0], length = arr. length; I <length & callback. call (bind, I, value )! = False; value = arr [++ I]) {};
}
}
Recently, many Javascript programs have been used. I took a look at recent articles and posted articles on the team's internal blog, all of which are JavaScript. . It seems to be a big change. You need to balance it.