
Security News
OWASP 2025 Top 10 Adds Software Supply Chain Failures, Ranked Top Community Concern
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.
tree-snap-shot
Advanced tools
Comparison function of simple objects (objects that can be successfully restored by JSON.stringify/parse);
Using npm:
$ npm i --save tree-snap-shot
In Node.js:
The comparison of arrays refers to the diff algorithm of git;
const snapshot = require('tree-snap-shot')
//compare array
var arr1= ['a', 'b', 'c', 'd', 'e'];
var arr2= ['aa', 'b', 'c', '+', 'd', 'e', 'f']
snapshot.compare(arr1,arr2).getDiff(df => {
console.log(JSON.stringify(df))//
})
//result
[["diff",[],[
["update",0,"aa"],
["add",3,"+"],
["add",5,"f"]
]]]
In Node.js:
compare object and array respectively
const snapshot = require('tree-snap-shot')
//compare object
let AA = {
a: 'a',
b: 'b',
c: 'c',
list: [
['a', 'b', 'c', 'd', 'e'], 1, 2
]
}
let BB = {
a: 'a',
e: 'b',
cc: 'cc',
list: [
'0', ['b', 'c', 'dd', 'e'], 1, 2
]
}
snapshot.compare(AA,BB).getDiff(df => {
console.log(JSON.stringify(df))
})
//result
//'add' means the these fields are new added;
//'update' means the these fields' values have been updated;
//'del' means the these fields have been deleted;
//['diff',[path to the list],[operations]]
[["add",{"e":"b","cc":"cc"}],
["del",{"b":null,"c":null}],
["diff",["list",0],[
["del",0],
["update",3,"dd"]
]],
["diff",["list"],[
["add",0,"0"]]
]]
In Node.js:
Here is a display of the relatively complete function
const snapshot = require('tree-snap-shot')
let obj1 = {
name: 'obj1',
pA: 'pA',
children: [{
name: 'child1',
cA: 'cA',
cB: 'cB'
}, {
name: 'child2',
cA: 'cA',
cB: 'cB'
}, {
name: 'child3',
cA: 'cA',
cB: 'cB'
}, ]
}
let obj2 = {
name: 'obj2',
pA: 'pA',
children: [
0, //add
{
name: 'child1',
cA: 'cA',
cB: 'cB',
add: 'add',//add
}, {
name: 'child2',
cA: 'cA',
cB: 'cB'
}, {//changed
name: 'child3',
cAA: 'cAA',
cBB: 'cBB'
}]
}
snapshot.compare(obj1, obj2).getDiff(df => {
console.log(JSON.stringify(df.toJS()))
});
//result
[
["update", {
"name": "obj2"
}],
["add", {
"children": {
//A parameter in children [0] is replaced, and the similarity is 0.75;
"0": {
"add": "add"//It is considered that we only add an attribute 'add' after the original object is shifted;
}
}
}],
["diff", ["children"],
[
["add", 0, 0],
["update", 2,
//For children [2], most attributes have been changed, we can say that the whole is replaced with a new one; Here, the default similarity of the two objects is 0.6, which is the dividing line of the replacement judgment
{
"name": "child3",
"cAA": "cA",
"cBB": "cB"
}]
]
]
]
**Here is an example of the above similarity judgment**
//snapshot.similarity(obj1.children[0] , obj2.children[1])
let similarity = snapshot.similarity({
name: 'child1',
cA: 'cA',
cB: 'cB'
}, {
name: 'child1',
cA: 'cA',
cB: 'cB',
add: 'add'
});
console.log(similarity); //{ unchanged: 3, add: 1, del: 0, update: 0, similarity: 0.75 }
In the array, if there is an attribute ID in two children objects, it will directly compare whether the two ID values are the same, instead of comparing the structural similarity. Please add ID for better performance;
In Node.js:
restore function
const snapshot = require('tree-snap-shot')
let obj1 = () => ({
key1: 'val-1',
key2: 'val-2',
key3: 'val-3',
say() {}
})
let obj2 = {
key1: 'val-11',
key2: 'val-22',
key3: 'val-33',
}
let log;
snapshot.compare(obj1(), obj2).exportLog(lg => {
log = lg;
});
let copy1 = obj1()
snapshot.replay(log, copy1, oper => {
if (oper[0] == 'update') {
delete oper[1].key2;//modify operation content
}
if(oper[0] == 'del'){
return false;//skip this step
}
});
console.log(copy1);
//result
{
key1: 'val-11',
key2: 'val-2',
key3: 'val-33',
say(){}
}
In Node.js:
step-wise restore(1.0.8)
const snapshot = require('tree-snap-shot')
let obj1 ={
key1: 'val-1',
key2: 'val-2',
key3: 'val-3',
}
snapshot.step(['add', {
test: 1
}], obj1)
console.log(obj1);
//result
{
key1: 'val-1',
key2: 'val-2',
key3: 'val-3',
test: 1
}
filte tree1 with filter
let tree1 = {
1: [0, 1, 2, 3],
2: 2,
3: 3,
list: [{
id: 1
}, {}]
}
let filter = {
1: {
2: null,//null means fuzzy matching
},
2: null,
4: null,
list: {
0: null
}
}
console.log(snapshot.difference(tree1, filter));//tree1 remove public parts
//result
{
'1': [ 0, 1, undefined, 3 ],
'3': 3,
list: [ undefined , {} ]
}
console.log(snapshot.union(tree1, filter));//get public parts between tree1 and filter
//result
{ '1': [ undefined, undefined, 2 ], '2': 2, list: [ { id: 1 } ] }
All suggestions and opinions are welcome.
QQ:454413790 Email: 454413790@qq.com
FAQs
compare 2 trees differences
The npm package tree-snap-shot receives a total of 2 weekly downloads. As such, tree-snap-shot popularity was classified as not popular.
We found that tree-snap-shot demonstrated a not healthy version release cadence and project activity because the last version was released 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
OWASP’s 2025 Top 10 introduces Software Supply Chain Failures as a new category, reflecting rising concern over dependency and build system risks.

Research
/Security News
Socket researchers discovered nine malicious NuGet packages that use time-delayed payloads to crash applications and corrupt industrial control systems.

Security News
Socket CTO Ahmad Nassri discusses why supply chain attacks now target developer machines and what AI means for the future of enterprise security.