Security News
JSR Working Group Kicks Off with Ambitious Roadmap and Plans for Open Governance
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
The traverse npm package is a comprehensive tool for traversing and transforming JavaScript objects. It allows you to easily navigate through objects, arrays, and other nested structures, and apply functions to their elements. It's particularly useful for manipulating complex data structures, applying transformations, and extracting information in a flexible manner.
Traversing and modifying objects
This feature allows you to traverse through an object and modify elements. In the code sample, the value 2 in the array under key 'a' is updated to 222.
var traverse = require('traverse');
var obj = { a: [1, 2, 3], b: 4 };
traverse(obj).forEach(function (x) {
if (x === 2) this.update(222);
});
Cloning and transforming objects
This feature enables deep cloning of objects with the option to apply transformations during the cloning process. In the example, all numbers in the object are multiplied by 100.
var traverse = require('traverse');
var obj = { a: 1, b: [2, 3] };
var clone = traverse(obj).map(function (node) {
if (typeof node === 'number') this.update(node * 100);
});
Extracting specific elements
This feature is useful for extracting leaf nodes from a complex object structure. The code sample demonstrates how to collect all leaf nodes (elements without child nodes) into an array.
var traverse = require('traverse');
var obj = { a: 1, b: { c: 2, d: [3, 4] } };
var leaves = traverse(obj).reduce(function (acc, x) {
if (this.isLeaf) acc.push(x);
return acc;
}, []);
Lodash is a utility library that provides functions for common programming tasks, including object manipulation. While it offers some similar functionalities for traversing and manipulating objects, it's more general-purpose compared to traverse, which is specifically designed for deep traversal and transformation of objects.
Ramda is a functional programming library that emphasizes immutability and side-effect free functions. It includes utilities for working with objects in a functional manner. Compared to traverse, Ramda offers a broader set of functional programming tools but might require more setup for deep object traversal and transformation tasks.
Traverse and transform objects by visiting every node on a recursive walk.
negative.js
var traverse = require('traverse');
var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ];
traverse(obj).forEach(function (x) {
if (x < 0) this.update(x + 128);
});
console.dir(obj);
Output:
[ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ]
leaves.js
var traverse = require('traverse');
var obj = {
a : [1,2,3],
b : 4,
c : [5,6],
d : { e : [7,8], f : 9 },
};
var leaves = traverse(obj).reduce(function (acc, x) {
if (this.isLeaf) acc.push(x);
return acc;
}, []);
console.dir(leaves);
Output:
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
scrub.js:
var traverse = require('traverse');
var obj = { a : 1, b : 2, c : [ 3, 4 ] };
obj.c.push(obj);
var scrubbed = traverse(obj).map(function (x) {
if (this.circular) this.remove()
});
console.dir(scrubbed);
output:
{ a: 1, b: 2, c: [ 3, 4 ] }
Each method that takes an fn
uses the context documented below in the context
section.
Execute fn
for each node in the object and return a new object with the
results of the walk. To update nodes in the result use this.update(value)
.
Execute fn
for each node in the object but unlike .map()
, when
this.update()
is called it updates the object in-place.
For each node in the object, perform a
left-fold
with the return value of fn(acc, node)
.
If acc
isn't specified, acc
is set to the root object for the first step
and the root element is skipped.
Return an Array
of every possible non-cyclic path in the object.
Paths are Array
s of string keys.
Return an Array
of every node in the object.
Create a deep clone of the object.
Get the element at the array path
.
Set the element at the array path
to value
.
Return whether the element at the array path
exists.
Each method that takes a callback has a context (its this
object) with these
attributes:
The present node on the recursive walk
An array of string keys from the root to the present node
The context of the node's parent.
This is undefined
for the root node.
The name of the key of the present node in its parent.
This is undefined
for the root node.
Whether the present node is the root node
Whether or not the present node is a leaf node (has no children)
Depth of the node within the traversal
If the node equals one of its parents, the circular
attribute is set to the
context of that parent and the traversal progresses no deeper.
Set a new value for the present node.
All the elements in value
will be recursively traversed unless stopHere
is
true.
Remove the current element from the output. If the node is in an Array it will be spliced off. Otherwise it will be deleted from its parent.
Delete the current element from its parent in the output. Calls delete
even on
Arrays.
Call this function before any of the children are traversed.
You can assign into this.keys
here to traverse in a custom order.
Call this function after any of the children are traversed.
Call this function before each of the children are traversed.
Call this function after each of the children are traversed.
Using npm do:
$ npm install traverse
Using expresso do:
$ expresso
100% wahoo, your stuff is not broken!
Use browserify to run traverse in the browser.
traverse has been tested and works with:
FAQs
traverse and transform objects by visiting every node on a recursive walk
We found that traverse demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
At its inaugural meeting, the JSR Working Group outlined plans for an open governance model and a roadmap to enhance JavaScript package management.
Security News
Research
An advanced npm supply chain attack is leveraging Ethereum smart contracts for decentralized, persistent malware control, evading traditional defenses.
Security News
Research
Attackers are impersonating Sindre Sorhus on npm with a fake 'chalk-node' package containing a malicious backdoor to compromise developers' projects.