Get unlimited public & private packages + team-based management with npm Teams.Learn more »

obj-toposort

2.0.0 • Public • Published

obj-toposort

Sort objects with dependencies

Sort an array of objects so the dependencies are handled first.

var objToposort = require('obj-toposort')
 
/* using default keys */
 
var tasks = [
  { id: 'party':      deps: ['shoes','pants','shirt'], data: 'party on!'             },
  { id: 'socks':      deps: [],                        data: 'put on your socks'     },
  { id: 'jacket':     deps: ['shirt'],                 data: 'put on your jacket'    },
  { id: 'shoes':      deps: ['socks'],                 data: 'put on your shoes'     },
  { id: 'underwear':  deps: [],                        data: 'put on your underwear' },
  { id: 'shirt':      deps: [],                        data: 'put on your shirt'     },
  { id: 'pants':      deps: ['underwear'],             data: 'put on your pants'     },
]
 
objToposort(tasks).forEach(function(task){
  console.log(task.data)
})

result:

put on your underwear
put on your pants
put on your shirt
put on your socks
put on your shoes
put on your jacket
party on!

custom keys

You can also use custom keys.

var objToposort = require('obj-toposort')
 
var tasks = [
  { name: 'party':      requirements: ['shoes','pants','shirt'], data: 'party on!'             },
  { name: 'socks':      requirements: [],                        data: 'put on your socks'     },
  { name: 'jacket':     requirements: ['shirt'],                 data: 'put on your jacket'    },
  { name: 'shoes':      requirements: ['socks'],                 data: 'put on your shoes'     },
  { name: 'underwear':  requirements: [],                        data: 'put on your underwear' },
  { name: 'shirt':      requirements: [],                        data: 'put on your shirt'     },
  { name: 'pants':      requirements: ['underwear'],             data: 'put on your pants'     },
]
 
objToposort(tasks, 'name', 'requirements').forEach(function(task){
  console.log(task.data)
})

Errors

The following cyclic dependencies will throw errors.

var objToposort = require('./index.js')
 
/* self dependency */
 
var tasks = [
  { id: 'a',      deps: ['a'], },
]
 
try {
  objToposort(tasks).forEach(function(task){ console.log(task.id) })
} catch (error) {
  console.error(error)
}
 
 
/* cyclic dependency */
 
var tasks = [
  { id: 'a',      deps: ['b'], },
  { id: 'b',      deps: ['a'], },
]
 
try {
  objToposort(tasks).forEach(function(task){ console.log(task.id) })
} catch (error) {
  console.error(error)
}

Install

npm i obj-toposort

DownloadsWeekly Downloads

103

Version

2.0.0

License

ISC

Last publish

Collaborators

  • avatar