Skip to content

Instantly share code, notes, and snippets.

@steveholgado
Last active January 16, 2019 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save steveholgado/dcec99e082764b1cb5c8db0e0ddb242f to your computer and use it in GitHub Desktop.
Save steveholgado/dcec99e082764b1cb5c8db0e0ddb242f to your computer and use it in GitHub Desktop.
Useful functions for working with arrays

Array functions

Useful functions for working with arrays:

  • Range
  • Flatten (recursively)
  • Chunk
  • Remove duplicates
  • Remove duplicates by object property
  • Group by object property
function chunk (arr, size) {
return arr
.reduce((acc, _, i) =>
(i % size)
? acc
: [...acc, arr.slice(i, i + size)]
, [])
}
// USAGE
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const result = chunk(numbers, 3)
console.log(result)
// [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
function flatten (arr) {
return arr
.reduce((acc, cur) =>
Array.isArray(cur)
? acc.concat(flatten(cur))
: acc.concat(cur)
, [])
}
// USAGE
const fruits = ['apple', ['pear', ['kiwi', 'orange']], ['melon']]
const result = flatten(fruits)
console.log(result)
// ['apple', 'pear', 'kiwi', 'orange', 'melon']
function groupByObjectProp (arr, prop) {
return arr
.reduce((acc, cur) => {
const key = cur[prop]
acc[key] = acc[key] || []
acc[key].push(cur)
return acc
}, {})
}
// USAGE
const foods = [
{ name: 'apple', category: 'fruits' },
{ name: 'pear', category: 'fruits' },
{ name: 'broccoli', category: 'vegetables' },
{ name: 'potato', category: 'vegetables' },
{ name: 'almond', category: 'nuts' },
{ name: 'kiwi', category: 'fruits' },
{ name: 'orange', category: 'fruits' },
{ name: 'cabbage', category: 'vegetables' },
{ name: 'melon', category: 'fruits' },
{ name: 'peacan', category: 'nuts' },
{ name: 'walnut', category: 'nuts' }
]
const result = groupByObjectProp(foods, 'category')
console.log(result)
/*
{
fruit: [
{ name: 'apple', category: 'fruits' },
{ name: 'pear', category: 'fruits' },
{ name: 'kiwi', category: 'fruits' },
{ name: 'orange', category: 'fruits' },
{ name: 'melon', category: 'fruits' }
],
vegetable: [
{ name: 'broccoli', category: 'vegetables' },
{ name: 'potato', category: 'vegetables' },
{ name: 'cabbage', category: 'vegetables' }
],
nut: [
{ name: 'almond', category: 'nuts' },
{ name: 'peacan', category: 'nuts' },
{ name: 'walnut', category: 'nuts' }
]
}
*/
function range (start, end) {
return Array(end - start + 1)
.fill()
.map((_, i) => i + start)
}
function range2 (start, end) {
return Array.from(
{ length: end - start + 1 },
(_, i) => i + start
)
}
function range3 (start, end) {
return [...Array(end - start + 1).keys()]
.map((_, i) => i + start)
}
// USAGE
const result = range(5, 10)
console.log(result)
// [5, 6, 7, 8, 9, 10]
function removeDupsByObjectProp (arr, prop) {
return arr
.filter((item, i, self) =>
i === self.findIndex(found => found[prop] === item[prop])
)
}
// USAGE
const foods = [
{ name: 'apple', category: 'fruits' },
{ name: 'apple', category: 'fruits' },
{ name: 'apple', category: 'fruits' },
{ name: 'pear', category: 'fruits' },
{ name: 'kiwi', category: 'fruits' },
{ name: 'kiwi', category: 'fruits' },
{ name: 'broccoli', category: 'vegetables' },
{ name: 'broccoli', category: 'vegetables' },
{ name: 'potato', category: 'vegetables' }
]
const result = removeDupsByObjectProp(foods, 'name')
console.log(result)
/*
[
{ name: 'apple', category: 'fruits' },
{ name: 'pear', category: 'fruits' },
{ name: 'kiwi', category: 'fruits' },
{ name: 'broccoli', category: 'vegetables' },
{ name: 'potato', category: 'vegetables' }
]
*/
function removeDups (arr) {
return arr
.filter((item, i, self) => self.indexOf(item) === i)
}
// USAGE
const fruits = ['apple', 'apple', 'apple', 'pear', 'kiwi', 'kiwi']
const result = removeDups(fruits)
console.log(result)
// ['apple', pear', 'kiwi']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment