既に存在している変数を動的に指定して処理したい時の方法です。
eval()を使用して文字列をJavaScriptコードとして評価します。
eval()
eval()関数は、文字列として表現されたJavaScriptコードを評価します。
ただ、文字列をコードとして評価するのは危険なため、GETやPOSTされたリクエストには使用しないようにしましょう。
第三者が入力したコードに対してeval()は危険です、今回は既に存在しているコード内の変数に使用するので大丈夫です。
サンプルコード
あるシステムでコード内に配列で持っていた値をDBに入れる時に使用しました。
データはもっと数があったので、最初からDBに入れてくれよって感じですけど。
サンプルコードの値は変えています。
const vegetables = [
{id: 1, name: 'キャベツ'},
{id: 2, name: 'レタス'},
{id: 3, name: '人参'},
{id: 4, name: 'トマト'},
{id: 5, name: 'スイカ'}
];
const fruits = [
{id: 1, name: 'リンゴ'},
{id: 2, name: '桃'},
{id: 3, name: 'イチゴ'},
{id: 4, name: 'ゴーヤ'},
{id: 5, name: 'メロン'}
];
['vegetables', 'fruits'].map(key => {
const data = eval(`${key}`);
data.map(v => {
console.log(`INSERT INTO food(category, id, name) VALUES('${key}', ${v.id}, '${v.name}');`);
});
});
「const data = eval(${key}
);」でkeyの文字列をコードとして評価してdataに代入しています。
出力結果は下記になります。
INSERT INTO food(category, id, name) VALUES('vegetables', 1, 'キャベツ');
INSERT INTO food(category, id, name) VALUES('vegetables', 2, 'レタス');
INSERT INTO food(category, id, name) VALUES('vegetables', 3, '人参');
INSERT INTO food(category, id, name) VALUES('vegetables', 4, 'トマト');
INSERT INTO food(category, id, name) VALUES('vegetables', 5, 'スイカ');
INSERT INTO food(category, id, name) VALUES('fruits', 1, 'リンゴ');
INSERT INTO food(category, id, name) VALUES('fruits', 2, '桃');
INSERT INTO food(category, id, name) VALUES('fruits', 3, 'イチゴ');
INSERT INTO food(category, id, name) VALUES('fruits', 4, 'ゴーヤ');
INSERT INTO food(category, id, name) VALUES('fruits', 5, 'メロン');
まとめ
eval()は便利ですけど、危険性もあるので注意して使うようにしましょう。
そもそも大量のデータを設定ファイルやソース内に保持しないで、最初からDBを使用しましょう。