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)
0 件のコメント:
コメントを投稿