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")) { this.remove(); } });
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:
* type .key ancestor selector parent > selector sibling ~ selector selector1, selector2 :root :nth-child(n) :nth-child(even) :nth-child(odd) :nth-last-child(n) :first-child :last-child :only-child :has(selector) :val("string") :contains("substring")
See details on each selector, and try them out on the JSONSelect website.
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.