🔥 NEW Code Tidbit Every Week 🔥

# Print Ranges Natively in JS

One of my favorite feature of Ruby is ranges. But it’s not natively available in JS. That’s about to change! Learning ES6 from @getify 🤩

Add this snippet to print ranges in your number prototype!

Number.prototype[Symbol.iterator] = function*() {
  for(let i = 0; i <= this; i++) {
    yield i;
  }
};

[...3]; // [ 0, 1, 2, 3 ]
[...6]; // [ 0, 1, 2, 3, 4, 5, 6 ]

# Examples

You can even apply your standard loop methods on it!

# Using it with Map

Use it with the map method to triple each of the number.

// Number.prototype[Symbol.iterator] = function*() {...}

const triple = [...3].map(x => x * 2);

triple // [ 0, 3, 6, 9 ]

# Using it with Filter

Combine it with the filter method to get rid of the odd numbers. (by the way, nothing wrong with odd one 😉)

// Number.prototype[Symbol.iterator] = function*() {...}

const even = [...10].filter(x => x % 2 === 0);

even; // [ 0, 2, 4, 6, 8, 10 ]

# Community Suggestions

# Use with caution

This code recipe does alter the built-in prototype. And this can lead to potential problem.

A popular library call MooTools had an unfortunately incident known as #smooshgate. You can read this article that explained what happened.

If you need custom behaviour, it's better to define your own method instead of changing a native one. That way you don't risk breaking anything at all.

Thanks: Robin V and @_gsathya

# Community Examples

# Create Range with Start Value

Improvement to build a specific range.

Number.prototype[Symbol.iterator] = function*() { 
  for (let i = 0; i <= this; i++) yield i;
}

Array.prototype.to = function(arr) { 
  return arr.filter(val => !Array.from(this).includes(val));
}

console.log([...2]); // [0, 1, 2]
console.log([...5]); // [0, 1, 2, 3, 4, 5]
console.log([...2].to([...5])); // [3, 4, 5]

Thanks: @omiraclx

# Method to Print Ranges

Brian R: In Ruby, you can just say (0..10) and it generates an array of numbers from 0 to 10. If you do (0...10), it will give you from 1 to 9. In the current ECMA spec, you can't do this without writting your own function. The closest thing in the current spec that I've seen is this:

[...Array(5).keys()];

// [ 0, 1, 2, 3, 4 ]

Very similar using Array.from

Array.from({length: 5}, (v, i) => i);

// [0, 1, 2, 3, 4]

Or create a function:

function range(start, end) {
  let arr = [];
  for(let i = start; i <= end; i++) {
    arr.push(i);
  }
  return arr;
}

range(5, 10); // [ 5, 6, 7, 8, 9, 10 ]

Thanks: Brian R.

# Another Method to Print Ranges

const range = length => {
  return new Array(length).map((_, index) => {
    return index;
  });
}

range(5); // [<5 empty items>]

Thanks @mieszkogulinski

# Resources

  • I learned this from a course on Pluralsight. It's called ES6: The Right Parts from Kyle Simpson.

  • It is a paid course, but I found a free transcript here.

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators


Related Tidbits