Traverse and modify objects with JSONSelect selectors


js-select uses js-traverse to traverse and modify JavaScript object nodes that match JSONSelect selectors.

var people = {
   george: {
      age : 35,
      movie: "Repo Man"
   mary: {
      age: 15,
      movie: "Twilight"

Iterates over all matching nodes in the object. The callback gets a special this context. See js-traverse for all the things you can do to modify and inspect the node with this context. In addition, js-select adds a this.matches() which will test if the node matches a selector:

select(people).forEach(function(node) {
   if (this.matches(".mary > .movie")) {

Returns all matching nodes from the object.

select(people, ".age").nodes(); // [35, 15] 

Removes matching elements from the original object.

select(people, ".age").remove();

Updates all matching nodes using the given callback.

select(people, ".age").update(function(age) {
   return age - 5;

Reduces the original object down to only the matching elements (the hierarchy is maintained).

select(people, ".age").condense();
    george: { age: 35 },
    mary: { age: 15 }

js-select supports the following JSONSelect selectors:

ancestor selector
parent > selector
sibling ~ selector
selector1, selector2

See details on each selector, and try them out on the JSONSelect website.

For node, install with npm:

npm install js-select

For the browser, download the select.js file or fetch the latest version from npm and build a browser file using browserify:

npm install browserify -g
npm install js-select
browserify --require js-select --outfile select.js

this will build a browser file with require('js-select') available.

Huge thanks to @substack for the ingenious js-traverse and @lloyd for the ingenious JSONSelect spec and selector parser.