GOAL: add all elements from an array of integers and arrays, each child array is a set of 2 integers denoting a start and end of a range.
HTML invocation:
<div class="block" onclick="test([33,88,[1,5],[8,13],[22,25]]);">click</div>
<div id="paper"></div>
I have the following JavaScript:
<script>
function test(clickArray) {
let theArray = [];
for (i = 0; i < clickArray.length; i++) {
theArray.push(clickArray[i]);
if (clickArray[i].length > 1) {
range(clickArray[i][0], clickArray[i][1], theArray);
}
}
writeArray(theArray);
}
function writeArray(anArray) {
let pencilArray = [];
for (let i = 0; i < anArray.length; i++) {
pencilArray.push();
}
document.getElementById("paper").innerHTML = pencilArray.join("<br>");
}
function range(start, end, rangeArray) {
for (let i = start; i <= end; i++) {
rangeArray.push(i);
}
return rangeArray;
}
</script>
When I invoke the onclick JavaScript the output is:
33 88 1,5 1 2 3 4 5 8,13 8 9 10 11 12 13 22,25 22 23 24 25
Both the range passed and the elements constructed by the range() function are added to the final array, but I just want the elements, not the ranges, so output should be:
33 88 1 2 3 4 5 8 9 10 11 12 13 22 23 24 25
Advertisement
Answer
Here’s how you can handle numbers along with ranges.
const test = (arr) => {
const allNumbers = arr.reduce((acc, el) => {
if (Array.isArray(el)) {
const [start, end] = el;
for (let i = start; i <= end; i++) {
acc.push(i)
}
} else if (!Number.isNaN(el)) {
acc.push(el)
}
return acc
}, [])
document.getElementById('paper').innerHTML = allNumbers.join('<br />');
}<div class="block" onclick="test([[1,5],[8,13],[22,25], 99]);">click</div> <div id="paper"></div>