Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80742 views
1
// different ways to id objects
2
// use a req/res pair, since it's crazy deep and cyclical
3
4
// sparseFE10 and sigmund are usually pretty close, which is to be expected,
5
// since they are essentially the same algorithm, except that sigmund handles
6
// regular expression objects properly.
7
8
9
var http = require('http')
10
var util = require('util')
11
var sigmund = require('./sigmund.js')
12
var sreq, sres, creq, cres, test
13
14
http.createServer(function (q, s) {
15
sreq = q
16
sres = s
17
sres.end('ok')
18
this.close(function () { setTimeout(function () {
19
start()
20
}, 200) })
21
}).listen(1337, function () {
22
creq = http.get({ port: 1337 })
23
creq.on('response', function (s) { cres = s })
24
})
25
26
function start () {
27
test = [sreq, sres, creq, cres]
28
// test = sreq
29
// sreq.sres = sres
30
// sreq.creq = creq
31
// sreq.cres = cres
32
33
for (var i in exports.compare) {
34
console.log(i)
35
var hash = exports.compare[i]()
36
console.log(hash)
37
console.log(hash.length)
38
console.log('')
39
}
40
41
require('bench').runMain()
42
}
43
44
function customWs (obj, md, d) {
45
d = d || 0
46
var to = typeof obj
47
if (to === 'undefined' || to === 'function' || to === null) return ''
48
if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '')
49
50
if (Array.isArray(obj)) {
51
return obj.map(function (i, _, __) {
52
return customWs(i, md, d + 1)
53
}).reduce(function (a, b) { return a + b }, '')
54
}
55
56
var keys = Object.keys(obj)
57
return keys.map(function (k, _, __) {
58
return k + ':' + customWs(obj[k], md, d + 1)
59
}).reduce(function (a, b) { return a + b }, '')
60
}
61
62
function custom (obj, md, d) {
63
d = d || 0
64
var to = typeof obj
65
if (to === 'undefined' || to === 'function' || to === null) return ''
66
if (d > md || !obj || to !== 'object') return '' + obj
67
68
if (Array.isArray(obj)) {
69
return obj.map(function (i, _, __) {
70
return custom(i, md, d + 1)
71
}).reduce(function (a, b) { return a + b }, '')
72
}
73
74
var keys = Object.keys(obj)
75
return keys.map(function (k, _, __) {
76
return k + ':' + custom(obj[k], md, d + 1)
77
}).reduce(function (a, b) { return a + b }, '')
78
}
79
80
function sparseFE2 (obj, maxDepth) {
81
var seen = []
82
var soFar = ''
83
function ch (v, depth) {
84
if (depth > maxDepth) return
85
if (typeof v === 'function' || typeof v === 'undefined') return
86
if (typeof v !== 'object' || !v) {
87
soFar += v
88
return
89
}
90
if (seen.indexOf(v) !== -1 || depth === maxDepth) return
91
seen.push(v)
92
soFar += '{'
93
Object.keys(v).forEach(function (k, _, __) {
94
// pseudo-private values. skip those.
95
if (k.charAt(0) === '_') return
96
var to = typeof v[k]
97
if (to === 'function' || to === 'undefined') return
98
soFar += k + ':'
99
ch(v[k], depth + 1)
100
})
101
soFar += '}'
102
}
103
ch(obj, 0)
104
return soFar
105
}
106
107
function sparseFE (obj, maxDepth) {
108
var seen = []
109
var soFar = ''
110
function ch (v, depth) {
111
if (depth > maxDepth) return
112
if (typeof v === 'function' || typeof v === 'undefined') return
113
if (typeof v !== 'object' || !v) {
114
soFar += v
115
return
116
}
117
if (seen.indexOf(v) !== -1 || depth === maxDepth) return
118
seen.push(v)
119
soFar += '{'
120
Object.keys(v).forEach(function (k, _, __) {
121
// pseudo-private values. skip those.
122
if (k.charAt(0) === '_') return
123
var to = typeof v[k]
124
if (to === 'function' || to === 'undefined') return
125
soFar += k
126
ch(v[k], depth + 1)
127
})
128
}
129
ch(obj, 0)
130
return soFar
131
}
132
133
function sparse (obj, maxDepth) {
134
var seen = []
135
var soFar = ''
136
function ch (v, depth) {
137
if (depth > maxDepth) return
138
if (typeof v === 'function' || typeof v === 'undefined') return
139
if (typeof v !== 'object' || !v) {
140
soFar += v
141
return
142
}
143
if (seen.indexOf(v) !== -1 || depth === maxDepth) return
144
seen.push(v)
145
soFar += '{'
146
for (var k in v) {
147
// pseudo-private values. skip those.
148
if (k.charAt(0) === '_') continue
149
var to = typeof v[k]
150
if (to === 'function' || to === 'undefined') continue
151
soFar += k
152
ch(v[k], depth + 1)
153
}
154
}
155
ch(obj, 0)
156
return soFar
157
}
158
159
function noCommas (obj, maxDepth) {
160
var seen = []
161
var soFar = ''
162
function ch (v, depth) {
163
if (depth > maxDepth) return
164
if (typeof v === 'function' || typeof v === 'undefined') return
165
if (typeof v !== 'object' || !v) {
166
soFar += v
167
return
168
}
169
if (seen.indexOf(v) !== -1 || depth === maxDepth) return
170
seen.push(v)
171
soFar += '{'
172
for (var k in v) {
173
// pseudo-private values. skip those.
174
if (k.charAt(0) === '_') continue
175
var to = typeof v[k]
176
if (to === 'function' || to === 'undefined') continue
177
soFar += k + ':'
178
ch(v[k], depth + 1)
179
}
180
soFar += '}'
181
}
182
ch(obj, 0)
183
return soFar
184
}
185
186
187
function flatten (obj, maxDepth) {
188
var seen = []
189
var soFar = ''
190
function ch (v, depth) {
191
if (depth > maxDepth) return
192
if (typeof v === 'function' || typeof v === 'undefined') return
193
if (typeof v !== 'object' || !v) {
194
soFar += v
195
return
196
}
197
if (seen.indexOf(v) !== -1 || depth === maxDepth) return
198
seen.push(v)
199
soFar += '{'
200
for (var k in v) {
201
// pseudo-private values. skip those.
202
if (k.charAt(0) === '_') continue
203
var to = typeof v[k]
204
if (to === 'function' || to === 'undefined') continue
205
soFar += k + ':'
206
ch(v[k], depth + 1)
207
soFar += ','
208
}
209
soFar += '}'
210
}
211
ch(obj, 0)
212
return soFar
213
}
214
215
exports.compare =
216
{
217
// 'custom 2': function () {
218
// return custom(test, 2, 0)
219
// },
220
// 'customWs 2': function () {
221
// return customWs(test, 2, 0)
222
// },
223
'JSON.stringify (guarded)': function () {
224
var seen = []
225
return JSON.stringify(test, function (k, v) {
226
if (typeof v !== 'object' || !v) return v
227
if (seen.indexOf(v) !== -1) return undefined
228
seen.push(v)
229
return v
230
})
231
},
232
233
'flatten 10': function () {
234
return flatten(test, 10)
235
},
236
237
// 'flattenFE 10': function () {
238
// return flattenFE(test, 10)
239
// },
240
241
'noCommas 10': function () {
242
return noCommas(test, 10)
243
},
244
245
'sparse 10': function () {
246
return sparse(test, 10)
247
},
248
249
'sparseFE 10': function () {
250
return sparseFE(test, 10)
251
},
252
253
'sparseFE2 10': function () {
254
return sparseFE2(test, 10)
255
},
256
257
sigmund: function() {
258
return sigmund(test, 10)
259
},
260
261
262
// 'util.inspect 1': function () {
263
// return util.inspect(test, false, 1, false)
264
// },
265
// 'util.inspect undefined': function () {
266
// util.inspect(test)
267
// },
268
// 'util.inspect 2': function () {
269
// util.inspect(test, false, 2, false)
270
// },
271
// 'util.inspect 3': function () {
272
// util.inspect(test, false, 3, false)
273
// },
274
// 'util.inspect 4': function () {
275
// util.inspect(test, false, 4, false)
276
// },
277
// 'util.inspect Infinity': function () {
278
// util.inspect(test, false, Infinity, false)
279
// }
280
}
281
282
/** results
283
**/
284
285