回答編集履歴

3

解説を追記

2017/11/20 11:07

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36115

test CHANGED
@@ -62,7 +62,9 @@
62
62
 
63
63
  while( x = obj.shift() ) {
64
64
 
65
+ if (x.v)
66
+
65
- if (x.v) yield x.v
67
+ yield x.v
66
68
 
67
69
  else {
68
70
 
@@ -113,3 +115,15 @@
113
115
  getFile("5.txt");
114
116
 
115
117
  ```
118
+
119
+
120
+
121
+ 不要と思いますが解説。
122
+
123
+ `[{k:'1.txt', v:'1st request'}, ...]`のような構造体を作り、`Proxy`により独自アクセサを設定することによって、順序型であることを意識せずにプロパティにアクセスするようにしました。
124
+
125
+ また、`Symbol.iterator`の`getter`に出力の際のめんどくさい処理を設定することにより、列挙するだけで出力が得られるようになっています。
126
+
127
+ その結果、元コードに追加したのは3行のみ、というシンプルなコードになったと思います。
128
+
129
+ (Falsyな値が来るといろいろバグりますけど)

2

Symbol.iterator 使えばいいじゃん!

2017/11/20 11:07

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36115

test CHANGED
@@ -3,8 +3,6 @@
3
3
  負けないぞう!
4
4
 
5
5
  ```javascript
6
-
7
- // ajaxのフェイクバージョンのつもり
8
6
 
9
7
  function fakeAjax(url, callback){
10
8
 
@@ -44,7 +42,7 @@
44
42
 
45
43
  q[url] = response;
46
44
 
47
- q[output].forEach( x => console.log(x) );
45
+ [...q].forEach( x => console.log(x) );
48
46
 
49
47
  });
50
48
 
@@ -52,23 +50,19 @@
52
50
 
53
51
 
54
52
 
55
- const output = Symbol('output');
56
-
57
53
  const q = new Proxy([],{
58
54
 
59
55
  get: function(obj, prop) {
60
56
 
61
- if (prop===output) {
57
+ if (prop===Symbol.iterator) {
62
58
 
63
- if (obj.length) return [...(function*(){
59
+ if (obj.length) return function*(){
64
60
 
65
- let x = obj.shift();
61
+ let x;
66
62
 
67
- while( x ) {
63
+ while( x = obj.shift() ) {
68
64
 
69
- if (x.v)
70
-
71
- yield x.v
65
+ if (x.v) yield x.v
72
66
 
73
67
  else {
74
68
 
@@ -82,7 +76,7 @@
82
76
 
83
77
  if (!x) yield 'all done!';
84
78
 
85
- })()];
79
+ };
86
80
 
87
81
  }
88
82
 
@@ -98,7 +92,7 @@
98
92
 
99
93
  entry.v = value
100
94
 
101
- else
95
+ else
102
96
 
103
97
  obj.push({k:prop, v:value});
104
98
 

1

読み面杉

2017/11/20 10:26

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36115

test CHANGED
@@ -62,11 +62,13 @@
62
62
 
63
63
  if (obj.length) return [...(function*(){
64
64
 
65
- let x;
65
+ let x = obj.shift();
66
66
 
67
- while( x = obj.shift() ) {
67
+ while( x ) {
68
68
 
69
+ if (x.v)
70
+
69
- if (x.v) yield x.v
71
+ yield x.v
70
72
 
71
73
  else {
72
74
 
@@ -90,11 +92,15 @@
90
92
 
91
93
  set: function(obj, prop, value){
92
94
 
93
- let entry;
95
+ let entry = obj.filter( x => x.k == prop )[0];
94
96
 
95
- if (entry = obj.filter( x => x.k == prop )[0]) entry.v = value
97
+ if (entry)
96
98
 
99
+ entry.v = value
100
+
101
+ else
102
+
97
- else obj.push({k:prop, v:value});
103
+ obj.push({k:prop, v:value});
98
104
 
99
105
  },
100
106