vueのコードを修正する④
半年ほど前に、栄養価を確認できるレシピサイトをつくりました。
その為にがむしゃらに書きちらしてしまったコードを改善していきます。
この記事はその第四弾。
今回修正することになるコード
今回は↓のコードが修正されます。
import axios from "axios";
export default {
data: function () {
return {
show: false,
post: {},
posts: [],
allIngredients: [],
keyword: "",
errors: "",
uploadFile: null,
};
},
〜省略〜
computed: {
addNutrients: function () {
let sum_nutrients = {
Energy: "0",
Protein: "0",
Lipid: "0",
Carbohydrate: "0",
Dietary_fiber: "0",
Potassium: "0",
Calcium: "0",
iron: "0",
Zinc: "0",
VitaminA: "0",
VitaminB1: "0",
VitaminB2: "0",
VitaminC: "0",
Salt_equivalent: "0",
};
let sn_keys = Object.keys(sum_nutrients);
for (let ingrd in this.ingrd_sum) {
let bfr_num3 = ingrd.quantity;
for (let i = 0; i < 14; i++) {
let sn_key = sn_keys[i];
let num1 = parseFloat(sum_nutrients[sn_key]);
let num2 = parseFloat(ingrd[sn_key]);
let num3 = parseFloat(bfr_num3);
if (Number.isNaN(num2)) {
num2 = 0;
}
if (num3 < 0 || 1000 < num3) {
num3 = 1;
} else {
num2 = num2 * num3;
}
sum_nutrients[sn_key] = num1 + num2;
);
}
}
return sum_nutrients;
},
},
〜省略〜
methods: {
〜省略〜
Reflect_Nutrients: function (post) {
console.log(`this.post.Energy: ${this.post.Energy}`);
console.log(`this.sum_nutrients: ${JSON.stringify(this.sum_nutrients)}`);
this.post.Energy = this.addNutrients.Energy;
this.post.Protein = this.addNutrients.Protein;
this.post.Lipid = this.addNutrients.Lipid;
this.post.Carbohydrate = this.addNutrients.Carbohydrate;
this.post.Dietary_fiber = this.addNutrients.Dietary_fiber;
this.post.Potassium = this.addNutrients.Potassium;
this.post.Calcium = this.addNutrients.Calcium;
this.post.iron = this.addNutrients.iron;
this.post.Zinc = this.addNutrients.Zinc;
this.post.VitaminA = this.addNutrients.VitaminA;
this.post.VitaminB1 = this.addNutrients.VitaminB1;
this.post.VitaminB2 = this.addNutrients.VitaminB2;
this.post.VitaminC = this.addNutrients.VitaminC;
this.post.Salt_equivalent = this.addNutrients.Salt_equivalent;
},
クラスの作成とインポート
色々楽になりそうだし勉強になりそうだったので、栄養価のクラスを作成してみることにしました。各栄養価毎に処理を回すことも多かったので、栄養価名を配列で取得できるようなクラスメソッド(keyname)も定義しました。
●作成したクラス
export default class Nutrients {
constructor(
Energy = "0",
Protein = "0",
Lipid = "0",
Carbohydrate = "0",
Dietary_fiber = "0",
Potassium = "0",
Calcium = "0",
iron = "0",
Zinc = "0",
VitaminA = "0",
VitaminB1 = "0",
VitaminB2 = "0",
VitaminC = "0",
Salt_equivalent = "0"
) {
this.Energy = Energy;
this.Protein = Protein;
this.Lipid = Lipid;
this.Carbohydrate = Carbohydrate;
this.Dietary_fiber = Dietary_fiber;
this.Potassium = Potassium;
this.Calcium = Calcium;
this.iron = iron;
this.Zinc = Zinc;
this.VitaminA = VitaminA;
this.VitaminB1 = VitaminB1;
this.VitaminB2 = VitaminB2;
this.VitaminC = VitaminC;
this.Salt_equivalent = Salt_equivalent;
}
keyname() {
return Object.keys(this);
}
}
このクラスをimportして利用していきます。
併せて変数名や、冗長な変数への格納工程も削除しました。
●修正後コード
<script>
import Nutrients from "./nutrientsClass.js";
import axios from "axios";
export default {
data: function () {
return {
show: false,
post: {},
posts: [],
allIngredients: [],
keyword: "",
errors: "",
uploadFile: null,
};
},
〜省略〜
computed: {
addNutrients: function () {
let totalNutrients = new Nutrients();
for (let i in this.allIngredients) {
for (let j = 0; j < 14; j++) {
let oneOfNutrientsName = totalNutrients.keyname()[j];
totalNutrients[oneOfNutrientsName] =
Number(totalNutrients[oneOfNutrientsName]) +
Number(this.allIngredients[i][oneOfNutrientsName]) *
Number(this.allIngredients[i].quantity);
}
}
return totalNutrients;
},
},
〜省略〜
methods: {
〜省略〜
Reflect_Nutrients: function (post) {
for (let i = 0; i < 14; i++) {
let sampleNutrients = new Nutrients();
let oneOfNutrientsName = sampleNutrients.keyname()[i];
this.post[oneOfNutrientsName] = this.addNutrients[oneOfNutrientsName];
}
}
配列の作成とインポート
HTTPのpushメソッドを利用する際のコードも冗長に見えたので、pushするプロパティの配列を予め作成してインポートすることにしました。
●作成した配列
const postParameters = [
"rname",
"rinformation",
"ingredient",
"procedure_1",
"procedure_2",
"procedure_3",
"rimage",
"Energy",
"Protein",
"Lipid",
"Carbohydrate",
"Dietary_fiber",
"Potassium",
"Calcium",
"iron",
"Zinc",
"VitaminA",
"VitaminB1",
"VitaminB2",
"VitaminC",
"Salt_equivalent",
];
export default postParameters;