Recursively run JavaScript callback function on each item in an array.
Recursion happens if the item is also an array - for example, as in 2D arrays.
Other example for a recursion are arrays of objects with nested objects - for example a menu with submenus.
npm install recursively -S
var recursively = require('recursively');
/**
* Recursively run callback on items in a Javascript array
* @param arr An array that can be iterated
* @param callback Callback will receive following arguments:
* item = value or item in the collection
* index = index of this item in the array
* arr = original array. So one can change the original value if needed
* @param childProperty Optional child property. If iterated item is an object, recursion will dive into this property
* @return void | any If callback returns a value, it is rewriting the value in array or else it is left intact
*/
recursively(input: array, callback: (item?:any, index?:number, childProperty?:array) => void|any)
var recursively = require('recursively');
var data = [new Array(3).fill(), new Array(3).fill(), new Array(3).fill()];
var i = 1;
recursively(data, function () {
return i++;
}
// data will be [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
Example 2 - populate array of 9 items with fibonacci numbers by referring to the previous item in collection
var recursively = require('recursively');
var data = new Array(9).fill();
recursively(data, function (item, index, collection) {
if (index === 0) {
return 0;
} else if (index === 1) {
return 1;
} else {
return collection[index - 2] + collection[index - 1];
}
});
// data will be [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
var recursively = require('recursively');
var data = [{enabled: false}, {enabled: false}];
recursively(data, function(item){
item.enabled = true;
});
// data will be [{enabled: true}, {enabled: true}];
var recursively = require('recursively');
var menu = [{
title: 'Level 1',
enabled: false,
submenu: [
{
title: 'Level2 a',
enabled: false,
submenu: [
{
title: 'Level3 aa',
enabled: false
},
{
title: 'Level3 ab',
enabled: false
}]
}, {
title: 'Level2 b',
enabled: false,
submenu: [
{
title: 'Level2 ba',
enabled: false
},
{
title: 'Level2 bb',
enabled: false
}]
}]
}];
function enableFirstChild(item, index) {
if (index === 0) {
item.enabled = true;
}
}
recursively(menu, enableFirstChild, 'submenu');
// menu[0].enabled==true;
// menu[0].submenu[0].enabled==true;
// menu[0].submenu[0].submenu[0].enabled==true;
// menu[0].submenu[1].submenu[0].enabled==true;
npm test
welcomed.... Just make a test.