1
1
const adjectives = [ "pretty" , "large" , "big" , "small" , "tall" , "short" , "long" , "handsome" , "plain" , "quaint" , "clean" , "elegant" , "easy" , "angry" , "crazy" , "helpful" , "mushy" , "odd" , "unsightly" , "adorable" , "important" , "inexpensive" , "cheap" , "expensive" , "fancy" ] ;
2
2
const colours = [ "red" , "yellow" , "blue" , "green" , "pink" , "brown" , "purple" , "brown" , "white" , "black" , "orange" ] ;
3
3
const nouns = [ "table" , "chair" , "house" , "bbq" , "desk" , "car" , "pony" , "cookie" , "sandwich" , "burger" , "pizza" , "mouse" , "keyboard" ] ;
4
- const lengths = [ adjectives . length , colours . length , nouns . length ] ;
5
- function * _random ( n ) {
6
- for ( let max of lengths ) {
7
- const arr = new Array ( n ) ;
8
- for ( i = 0 ; i < n ; i ++ ) arr [ i ] = Math . round ( Math . random ( ) * 1000 ) % max ;
9
- yield arr
10
- }
11
- }
12
- const data = [ ] , nTemplates = 10 , tbody = document . getElementsByTagName ( 'tbody' ) [ 0 ] ;
13
- let index = 1 , i , lbl , selected ;
4
+ const [ l1 , l2 , l3 ] = [ adjectives . length , colours . length , nouns . length ] ;
5
+
6
+ const nTemplates = ( n ) => Math . round ( n / 100 ) , tbody = document . getElementsByTagName ( 'tbody' ) [ 0 ] ;
7
+ let data = [ ] , index = 1 , i , lbl , selected ;
14
8
15
- function create ( n = 1000 ) { if ( data . length ) clear ( ) ; append ( n ) ; }
9
+ function create ( n = 1000 ) { if ( tbody . children . length ) clear ( ) ; append ( n ) ; }
16
10
function append ( n = 1000 ) {
17
- const [ r1 , r2 , r3 ] = _random ( n ) ; let j = 0 ;
18
- const itemTemplate1 = document . getElementById ( 'itemTemplate' ) . content . firstElementChild ;
19
- const itemTemplate = document . createDocumentFragment ( ) ;
20
- for ( i = 0 ; i < nTemplates ; i ++ ) itemTemplate . appendChild ( itemTemplate1 . cloneNode ( true ) ) ;
11
+ const nt = nTemplates ( n ) ; let j = 0 , r1 , r2 , r3 ;
12
+ const itemTemplate = document . getElementById ( 'itemTemplate' ) . content ;
13
+ while ( nt >= itemTemplate . children . length * 2 ) itemTemplate . appendChild ( itemTemplate . cloneNode ( true ) ) ;
14
+ while ( nt > itemTemplate . children . length ) itemTemplate . appendChild ( itemTemplate . firstElementChild . cloneNode ( true ) ) ;
15
+
21
16
const ids = Array . prototype . map . call ( itemTemplate . querySelectorAll ( 'td:first-child' ) , i => i . firstChild )
22
17
const labels = Array . prototype . map . call ( itemTemplate . querySelectorAll ( 'a.lbl' ) , i => i . firstChild ) ;
23
18
24
- while ( ( n -= nTemplates ) >= 0 ) {
25
- for ( i = 0 ; i < nTemplates ; i ++ , j ++ ) {
26
- ids [ i ] . nodeValue = index ++ ;
27
- data . push ( labels [ i ] . nodeValue = `${ adjectives [ r1 [ j ] ] } ${ colours [ r2 [ j ] ] } ${ nouns [ r3 [ j ] ] } ` )
28
- }
19
+ while ( ( n -= nt ) >= 0 ) {
20
+ for ( i = 0 ; i < nt ; i ++ , j ++ ) {
21
+ r1 = Math . round ( Math . random ( ) * 1000 ) % l1 ;
22
+ r2 = Math . round ( Math . random ( ) * 1000 ) % l2 ;
23
+ r3 = Math . round ( Math . random ( ) * 1000 ) % l3 ;
24
+ ( ids [ i ] . nodeValue = index ++ ) && data . push ( labels [ i ] . nodeValue = `${ adjectives [ r1 ] } ${ colours [ r2 ] } ${ nouns [ r3 ] } ` )
25
+ }
29
26
tbody . appendChild ( itemTemplate . cloneNode ( true ) ) ;
30
27
}
31
28
}
32
29
function update ( ) {
33
30
const labels = tbody . querySelectorAll ( 'a.lbl' ) , length = labels . length ;
34
- for ( i = 0 ; i < length ; i += 10 ) labels [ i ] . firstChild . nodeValue = data [ i ] += ' !!!' ;
31
+ for ( i = 0 ; i < length ; i += 10 ) labels [ i ] . firstChild . nodeValue = data [ i ] += ' !!!'
35
32
}
36
- function clear ( ) { data . length = 0 ; tbody . textContent = '' }
33
+ function clear ( ) { ( data = [ ] ) && ( tbody . textContent = '' ) }
37
34
38
35
function swap ( ) {
39
- if ( data . length < 999 ) return ; const first = tbody . firstElementChild ;
36
+ if ( tbody . children . length < 999 ) return ; const first = tbody . firstElementChild ;
40
37
[ data [ 1 ] , data [ 998 ] ] = [ data [ 998 ] , data [ 1 ] ] ;
41
38
tbody . insertBefore ( tbody . insertBefore ( first . nextElementSibling ,
42
39
tbody . children [ 998 ] ) . nextElementSibling , first . nextElementSibling ) ;
@@ -48,13 +45,14 @@ tbody.onclick = (e) => {
48
45
if ( element === selected ) selected . className = selected . className ? "" : "danger" ;
49
46
else {
50
47
if ( selected ) selected . className = "" ;
51
- element . className = "danger" ; selected = element
48
+ ( element . className = "danger" ) && ( selected = element )
52
49
}
53
50
} else if ( e . target . matches ( 'span.remove' ) ) {
54
- data . splice ( Array . prototype . indexOf . call ( tbody . children , tbody . removeChild ( e . target . parentNode . parentNode . parentNode ) ) , 1 ) ;
51
+ const element = e . target . parentNode . parentNode . parentNode ;
52
+ data . splice ( Array . prototype . indexOf . call ( tbody . children , element ) ) && tbody . removeChild ( element ) ;
55
53
}
56
54
}
57
55
for ( let [ key , fn ] of Object . entries ( {
58
- run : create , runlots : ( ) => create ( 10000 ) ,
56
+ run : create , runlots : ( ) => create ( 10000 ) ,
59
57
add : append , update, clear, swaprows : swap
60
- } ) ) document . getElementById ( key ) . onclick = ( e ) => { e . stopPropagation ( ) ; fn ( ) }
58
+ } ) ) document . getElementById ( key ) . onclick = ( e ) => { e . stopPropagation ( ) , fn ( ) }
0 commit comments