Open2

JavaScriptの小ネタ

koki yasudakoki yasuda

forEachの値変更

以下のようにforEachで配列を回しつつ、要素を更新したいときがあると思う。

const test = [1, 2, 3];

test.forEach((t) => t = 4);

console.log(test); // [1, 2, 3]

上記のコードは機能しない。

forEachで回している要素は、プリミティブなら値オブジェクトならメモリアドレスを保持する。

つまり、プリミティブの場合はメモリ的には別物扱いになる。

そのため、forEachで値を更新する場合は、

配列のインデックスを指定して本体に対して書き込むを行うか、

const test = [1, 2, 3];

test.forEach((t, i) => test[i] = 4);

console.log(test); // [4, 4, 4]

オブジェクトにしてプロパティに対して書き込む。

const test = [{id: 1}, {id: 2}, {id: 3}];

test.forEach((t) => t.id = 4);

console.log(test); // [4, 4, 4]
koki yasudakoki yasuda

階層の深いオブジェクトを改善する

const test = {
    findMany: () => {
        return {
            where: () => {
                return {
                    select: () => {
                        return new Error('Error');
                    }
                }
            }
        }
    }
};

ビルダーパターンを使う

const test = builder()
.add(findMany)
.add(where)
.add(select)
.build();