7
7
8
8
var util = require ( './util' ) ;
9
9
var has = Object . prototype . hasOwnProperty ;
10
+ var hasNativeMap = typeof Map !== "undefined" ;
10
11
11
12
/**
12
13
* A data structure which is a combination of an array and a set. Adding a new
@@ -16,7 +17,7 @@ var has = Object.prototype.hasOwnProperty;
16
17
*/
17
18
function ArraySet ( ) {
18
19
this . _array = [ ] ;
19
- this . _set = Object . create ( null ) ;
20
+ this . _set = hasNativeMap ? new Map ( ) : Object . create ( null ) ;
20
21
}
21
22
22
23
/**
@@ -37,7 +38,7 @@ ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
37
38
* @returns Number
38
39
*/
39
40
ArraySet . prototype . size = function ArraySet_size ( ) {
40
- return Object . getOwnPropertyNames ( this . _set ) . length ;
41
+ return hasNativeMap ? this . _set . size : Object . getOwnPropertyNames ( this . _set ) . length ;
41
42
} ;
42
43
43
44
/**
@@ -46,14 +47,18 @@ ArraySet.prototype.size = function ArraySet_size() {
46
47
* @param String aStr
47
48
*/
48
49
ArraySet . prototype . add = function ArraySet_add ( aStr , aAllowDuplicates ) {
49
- var sStr = util . toSetString ( aStr ) ;
50
- var isDuplicate = has . call ( this . _set , sStr ) ;
50
+ var sStr = hasNativeMap ? aStr : util . toSetString ( aStr ) ;
51
+ var isDuplicate = hasNativeMap ? this . has ( aStr ) : has . call ( this . _set , sStr ) ;
51
52
var idx = this . _array . length ;
52
53
if ( ! isDuplicate || aAllowDuplicates ) {
53
54
this . _array . push ( aStr ) ;
54
55
}
55
56
if ( ! isDuplicate ) {
56
- this . _set [ sStr ] = idx ;
57
+ if ( hasNativeMap ) {
58
+ this . _set . set ( aStr , idx ) ;
59
+ } else {
60
+ this . _set [ sStr ] = idx ;
61
+ }
57
62
}
58
63
} ;
59
64
@@ -63,8 +68,12 @@ ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
63
68
* @param String aStr
64
69
*/
65
70
ArraySet . prototype . has = function ArraySet_has ( aStr ) {
66
- var sStr = util . toSetString ( aStr ) ;
67
- return has . call ( this . _set , sStr ) ;
71
+ if ( hasNativeMap ) {
72
+ return this . _set . has ( aStr ) ;
73
+ } else {
74
+ var sStr = util . toSetString ( aStr ) ;
75
+ return has . call ( this . _set , sStr ) ;
76
+ }
68
77
} ;
69
78
70
79
/**
@@ -73,10 +82,18 @@ ArraySet.prototype.has = function ArraySet_has(aStr) {
73
82
* @param String aStr
74
83
*/
75
84
ArraySet . prototype . indexOf = function ArraySet_indexOf ( aStr ) {
76
- var sStr = util . toSetString ( aStr ) ;
77
- if ( has . call ( this . _set , sStr ) ) {
78
- return this . _set [ sStr ] ;
85
+ if ( hasNativeMap ) {
86
+ var idx = this . _set . get ( aStr ) ;
87
+ if ( idx >= 0 ) {
88
+ return idx ;
89
+ }
90
+ } else {
91
+ var sStr = util . toSetString ( aStr ) ;
92
+ if ( has . call ( this . _set , sStr ) ) {
93
+ return this . _set [ sStr ] ;
94
+ }
79
95
}
96
+
80
97
throw new Error ( '"' + aStr + '" is not in the set.' ) ;
81
98
} ;
82
99
0 commit comments