|
| 1 | +// The Sum of range |
| 2 | +function range(start, end, step = 1) { |
| 3 | + let array = []; |
| 4 | + if (step > 0) { |
| 5 | + for (let i = start; i <= end; i += step) { |
| 6 | + array.push(i); |
| 7 | + } |
| 8 | + } else { |
| 9 | + for (let i = start; i >= end; i += step) { |
| 10 | + array.push(i); |
| 11 | + } |
| 12 | + } |
| 13 | + return array; |
| 14 | +} |
| 15 | + |
| 16 | +function sum(numbers) { |
| 17 | + let total = 0; |
| 18 | + for (let number of numbers) { |
| 19 | + total += number; |
| 20 | + } |
| 21 | + return total; |
| 22 | +} |
| 23 | + |
| 24 | +console.log(range(1, 10)); // → [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |
| 25 | +console.log(sum(range(1, 10))); // → 55 |
| 26 | + |
| 27 | +console.log(range(1, 10, 2)); // → [1, 3, 5, 7, 9] |
| 28 | +console.log(range(5, 2, -1)); // → [5, 4, 3, 2] |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | + |
| 33 | +// Reversing of array |
| 34 | +function reverseArray(array) { |
| 35 | + let newArray = []; |
| 36 | + for (let i = array.length - 1; i >= 0; i--) { |
| 37 | + newArray.push(array[i]); |
| 38 | + } |
| 39 | + return newArray; |
| 40 | +} |
| 41 | + |
| 42 | +function reverseArrayInPlace(array) { |
| 43 | + for (let i = 0; i < Math.floor(array.length / 2); i++) { |
| 44 | + let temp = array[i]; |
| 45 | + array[i] = array[array.length - 1 - i]; |
| 46 | + array[array.length - 1 - i] = temp; |
| 47 | + } |
| 48 | +} |
| 49 | + |
| 50 | +let array = [1, 2, 3, 4, 5]; |
| 51 | +console.log(reverseArray(array)); // → [5, 4, 3, 2, 1] |
| 52 | + |
| 53 | +reverseArrayInPlace(array); |
| 54 | +console.log(array); // → [5, 4, 3, 2, 1] |
| 55 | + |
| 56 | + |
| 57 | + |
| 58 | +// A list |
| 59 | +function arrayToList(array) { |
| 60 | + let list = null; |
| 61 | + for (let i = array.length - 1; i >= 0; i--) { |
| 62 | + list = { value: array[i], rest: list }; |
| 63 | + } |
| 64 | + return list; |
| 65 | +} |
| 66 | + |
| 67 | +function listToArray(list) { |
| 68 | + let array = []; |
| 69 | + for (let node = list; node; node = node.rest) { |
| 70 | + array.push(node.value); |
| 71 | + } |
| 72 | + return array; |
| 73 | +} |
| 74 | + |
| 75 | +function prepend(value, list) { |
| 76 | + return { value, rest: list }; |
| 77 | +} |
| 78 | + |
| 79 | +function nth(list, n) { |
| 80 | + if (!list) return undefined; |
| 81 | + if (n === 0) return list.value; |
| 82 | + return nth(list.rest, n - 1); |
| 83 | +} |
| 84 | + |
| 85 | +let list = arrayToList([1, 2, 3]); |
| 86 | +console.log(list); // → { value: 1, rest: { value: 2, rest: { value: 3, rest: null } } } |
| 87 | + |
| 88 | +console.log(listToArray(list)); // → [1, 2, 3] |
| 89 | + |
| 90 | +console.log(prepend(0, list)); // → { value: 0, rest: { value: 1, rest: { value: 2, rest: { value: 3, rest: null } } } } |
| 91 | + |
| 92 | +console.log(nth(list, 1)); // → 2 |
| 93 | + |
| 94 | +function nthRecursive(list, n) { |
| 95 | + if (!list) return undefined; |
| 96 | + if (n === 0) return list.value; |
| 97 | + return nthRecursive(list.rest, n - 1); |
| 98 | +} |
| 99 | + |
| 100 | +console.log(nthRecursive(list, 1)); // → 2 |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | +// Deep comparison |
| 105 | +function deepEqual(a, b) { |
| 106 | + if (a === b) return true; |
| 107 | + |
| 108 | + if (a == null || typeof a !== "object" || b == null || typeof b !== "object") { |
| 109 | + return false; |
| 110 | + } |
| 111 | + |
| 112 | + let keysA = Object.keys(a), keysB = Object.keys(b); |
| 113 | + |
| 114 | + if (keysA.length !== keysB.length) return false; |
| 115 | + |
| 116 | + for (let key of keysA) { |
| 117 | + if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false; |
| 118 | + } |
| 119 | + |
| 120 | + return true; |
| 121 | +} |
| 122 | + |
| 123 | +let obj = { here: { is: "an" }, object: 2 }; |
| 124 | +console.log(deepEqual(obj, obj)); // → true |
| 125 | +console.log(deepEqual(obj, { here: { is: "an" }, object: 2 })); // → true |
| 126 | +console.log(deepEqual(obj, { here: { is: "another" }, object: 2 })); // → false |
0 commit comments