最後活躍 1 day ago

carPriceNormalizer.mjs 原始檔案
1#!/usr/bin/env node
2
3const currentYear = new Date().getFullYear();
4
5const adjustments = {
6 exteriorColor: {
7 black: 1000,
8 blue: -500,
9 burgundy: 500,
10 charcoal: 500,
11 deepBlue: 250,
12 silver: 0,
13 white: 250,
14 },
15 interiorColor: {
16 dark: 0,
17 light: 500,
18 mixed: -250,
19 },
20 miles: [ 5000, 150 ],
21 year: [ 1, 750 ],
22};
23
24const benchmark = {
25 exteriorColor: 'silver',
26 interiorColor: 'dark',
27 miles: 100000,
28 price: 10357,
29 year: 2016,
30};
31
32const [ price, year, miles, exteriorColor, interiorColor ] = process.argv.slice(2);
33// args list length
34if (process.argv.slice(2).length !== 5) {
35 throw new Error(`Expected exactly 5 args, found ${process.argv.slice(2).length}`);
36}
37// 1st 3 args should be numbers
38[ price, year, miles ].forEach((number, i) => {
39 if (isNaN(number)) {
40 throw new Error(`arg #${number + 1} should be number`);
41 }
42});
43// 4th arg should be enumerated
44if (!Object.keys(adjustments.exteriorColor).includes(exteriorColor)) {
45 throw new Error(`4th arg (exteriorColor) must be in list ${Object.keys(adjustments.exteriorColor).join(', ')}`);
46}
47// 5th arg should be enumerated
48if (!Object.keys(adjustments.interiorColor).includes(interiorColor)) {
49 throw new Error(`5th arg (interiorColor) must be in list ${Object.keys(adjustments.interiorColor).join(', ')}`);
50}
51
52const benchYearsOld = currentYear - benchmark.year;
53const yearsOld = currentYear - Number(year);
54
55function calcAdjustment (benchValue, value, [ quantifier, valueAdjustment ] = [ 1, 1 ]) {
56 return (Number(value) - benchValue) / quantifier * valueAdjustment;
57}
58
59let adjustedPrice = Number(price);
60adjustedPrice += calcAdjustment(benchmark.miles, miles, adjustments.miles);
61adjustedPrice += calcAdjustment(benchYearsOld, yearsOld, adjustments.year);
62adjustedPrice += calcAdjustment(0, adjustments.exteriorColor[exteriorColor]);
63adjustedPrice += calcAdjustment(0, adjustments.interiorColor[interiorColor]);
64
65console.log(adjustedPrice);
66