DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»

DEV Community πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’» is a community of 966,155 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

Create account Log in
Cover image for 1 line of code: How to get every odd item of an Array
martin krause
martin krause

Posted on • Updated on

1 line of code: How to get every odd item of an Array

const oddItems = arr => arr.filter((_, i) => i & 1 === 1);
Enter fullscreen mode Exit fullscreen mode

Returns an array which contains every odd (second) item of the original array.


The repository & npm package

You can find the all the utility functions from this series at github.com/martinkr/onelinecode
The library is also published to npm as @onelinecode for your convenience.

The code and the npm package will be updated every time I publish a new article.


Follow me on Twitter: @martinkr and consider to buy me a coffee

Photo by zoo_monkey on Unsplash


Top comments (13)

Collapse
 
jonrandy profile image
Jon Randy

Not looked for faster methods yet, but the current one seems overly verbose. Also, what is which for?

const oddItems = arr => arr.filter((_, index) => index % 2)
Enter fullscreen mode Exit fullscreen mode
Collapse
 
lexlohr profile image
Alex Lohr

Binary filters are even faster than the modulo:

const oddItems = arr => arr.filter((_, i) => i & 1 === 1);
Enter fullscreen mode Exit fullscreen mode
Collapse
 
jonrandy profile image
Jon Randy • Edited on

Faster still if you omit the unnecesary === 1 - it's about even on Firefox, but consistently quicker on Chrome (10-15%) - link

const oddItems = arr => arr.filter((_, i) => i & 1)
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
jonrandy profile image
Jon Randy • Edited on

Much faster again (on all tested browsers):

const oddItems = (arr, odds=[], i=0)=>{ for (i=0;i<arr.length;i++) (i & 1) && odds.push(arr[i]); return odds}
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
martinkr profile image
martin krause Author

Hi Jon Randy,

I updated the benchmark on hasty - impressive improvement!
I updated the code and the article.

Thank you for the improved code.

Cheers!

Thank you!

Thread Thread
 
lexlohr profile image
Alex Lohr

If you are already using a for loop, you can also jump 2 steps on every iteration:

const oddItems = (arr, odds=[], i) => { for (i = 1; i < arr.length; i = i + 2) odds.push(arr[i]); return odds}
Enter fullscreen mode Exit fullscreen mode
Thread Thread
 
jonrandy profile image
Jon Randy

Haha... yeah - oops

 
jonrandy profile image
Jon Randy • Edited on

You might want to make the benchmark call the functions as well as define them! :P

Thread Thread
 
giulio profile image
Giulio "Joshi"

wouldn't jumping 2 steps ensure only odd positional, but not values?
(I just assume an unsorted array of random values)

Thread Thread
 
jonrandy profile image
Jon Randy

Odd positional is what we're after

Collapse
 
martinkr profile image
martin krause Author

Hi Alex,

I checked the performance on hasty and indeed much faster. I updated the code and the article.

Thank you!

Collapse
 
martinkr profile image
martin krause Author

Thank you for your contribution. The "which" is a copy paste error :D
If you have any performance improvements, please share them and I'll happily adjust the code and the article.

Cheers,

Martin

Some comments have been hidden by the post's author - find out more

What image format should you use in your next project? πŸ€”