2019年8月28日水曜日
2019年4月16日火曜日
2019年4月12日金曜日
2019年4月11日木曜日
2019年4月10日水曜日
2019年4月8日月曜日
2019年4月7日日曜日
2019年4月5日金曜日
2019年4月3日水曜日
2019年3月31日日曜日
2019年3月29日金曜日
2019年3月28日木曜日
2019年3月24日日曜日
2019年3月23日土曜日
2019年3月22日金曜日
動的インポートとJSでのポインタ渡し
値が空オブジェクトになっているぞ!!
上のコメントで書いてある部分が悪さをしているコードになる。
## ポイント渡し風にするときは再帰関数を使う
JSではオブジェクトは参照渡しになっているが、上のコードを書いたときC言語で言うポインタ渡しになっていることを期待していた。
が、オブジェクトに他の値を代入すると参照関係が切れてしまって、`obj`とは全く関係のない値になってしまっていた。
このような場合は再帰関数を使うと期待した通りに動作してくれる。
少し読みづらくなっているが、predがその再帰関数となる。
```js
//修正後のsetProperty関数
function setProperty(obj, path, value) {
const pred = (prop, pathList, value) => {
const p = pathList[0]
if (pathList.length === 1) {
prop[p] = value
} else {
if (!prop[p]) {
prop[p] = {}
}
pathList.shift()
pred(prop[p], pathList, value)
}
}
pred(obj, path.split('/'), value)
}
```
pred関数内で行っている処理の内容は修正前のsetProperty関数と変わっていないが、再帰関数にしたことによってコードはちょっと見た目が変わっている。
が読みづらいし、Blogなので見栄をはってif文を消し関数型言語っぽくしてみるとこうなる。
```js
function setProperty(obj, path, value) {
const pred = (prop, pathList, value) => {
const p = pathList[0]
pathList.length === 1
? prop[p] = value
: pred(prop[p] ? prop[p] : prop[p] = {}, pathList.slice(1), value)
}
pred(obj, path.split('/'), value)
}
```
こっちのほうが見やすいかどうかは別としてすっきりとした。
登録:
投稿 (Atom)