-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy path6-proc.js
More file actions
54 lines (44 loc) · 1.22 KB
/
Copy path6-proc.js
File metadata and controls
54 lines (44 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
'use strict';
// Code improved characteristics:
// - procedural style
// - simplicity
// Implementation
const getPrice = (item) => item.price;
const item = (name, price, options = { convert: true }) => {
const convert = options.convert && typeof price === 'string';
const amount = convert ? parseFloat(price) : price;
return { name, price: amount };
};
const fromStruct = (obj, options) => {
const { name, price, cost } = obj;
return item(name, price ?? cost, options);
};
const fromTuple = (tuple, options) => {
const name = tuple[0];
const price = tuple[1];
return item(name, price, options);
};
const fromData = (data, options) => {
const isTuple = Array.isArray;
const factory = isTuple(data) ? fromTuple : fromStruct;
return factory(data, options);
};
// Usage
const goods = [
{ name: 'Laptop', price: 1500 },
{ name: 'Phone' },
{ price: 25, name: 'Mouse' },
{ name: 'Keyboard', price: 0 },
{ name: 'HDMI cable', cost: 10 },
['Bag', 50],
['Case', '150'],
['Box'],
{ name: 'Mouse pad' },
];
goods[8].price = 5;
const output = goods.map((data) => {
const item = fromData(data, { convert: true });
const price = getPrice(item);
return { data, item, price };
});
console.table(output);