Coder Social home page Coder Social logo

derhuerst / sorted-iterators-find-matching Goto Github PK

View Code? Open in Web Editor NEW
0.0 2.0 0.0 7 KB

Given an iterator of sorted items, find matching items in another.

Home Page: https://github.com/derhuerst/sorted-iterators-find-matching#sorted-iterators-find-matching

License: ISC License

JavaScript 100.00%
iterable iterator

sorted-iterators-find-matching's Introduction

sorted-iterators-find-matching

Given an iterator/list of sorted items, find matching items in another (sorted) iterator/list.

npm version build status ISC-licensed minimum Node.js version chat with me on Gitter support me via GitHub Sponsors

Installation

npm install sorted-iterators-find-matching

Usage

Let's say you have a sorted list of people

const people = [
	{id: 'ada', name: 'Ada'},
	{id: 'bob', name: 'Bob'},
	{id: 'dora', name: 'Dora'},
]

and a list of books, sorted by who owns them:

const books = [
	// Ada has no books.
	{nr: 5, belongsTo: 'bob'},
	{nr: 1, belongsTo: 'bob'},
	{nr: 4, belongsTo: 'bob'},
	// We don't know who Carlos is.
	{nr: 6, belongsTo: 'carlos'},
	{nr: 2, belongsTo: 'carlos'},
	{nr: 0, belongsTo: 'dora'},
	{nr: 3, belongsTo: 'elisa'},
]

Because both lists are sorted by the "person ID", all books owned by a single person occur consecutively. Therefore, we can tell which books a person owns, only by reading the books list until it mentions a different person. This is what sorted-iterators-find-matching does:

const iterateMatching = require('sorted-iterators-find-matching')

// We define a function that, given a person, tells if the book belongs to
// - that person, or
// - a person with an alphabetically ealier/lower person ID, or
// - a person with an alphabetically later/higher person ID.
const matchBookWithPerson = (person, book) => {
	if (person.id === book.belongsTo) return 0
	return person.id < book.belongsTo ? -1 : 1
}
const ownedBooks = iterateMatching(matchBookWithPerson, books)

for (const person of people) {
	console.log(`${person.name} has these books:`)
	for (const book of ownedBooks(person)) console.log(`- ${book.nr}`)
}

async iterators

If you have two async iterators, use sorted-iterators-find-matching/async:

const iterateMatching = require('sorted-iterators-find-matching/async')

const match = (itemOfListA, itemOfListB) => {
	if (itemOfListA.field === itemOfListB.field) return 0
	return itemOfListA.field < itemOfListB.field ? -1 : 1
}
const matching = iterateMatching(match, listA)

// Note the `for await`!
for await (const itemA of listA) {
	for await (const itemB of matching(itemA)) {
		console.log(itemA, itemB)
	}
}

Contributing

If you have a question or need support using sorted-iterators-find-matching, please double-check your code and setup first. If you think you have found a bug or want to propose a feature, use the issues page.

sorted-iterators-find-matching's People

Contributors

derhuerst avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.