|
1 | | -function mergeWith (object1, object2, lsuffix, rsuffix) { |
2 | | - const keys1 = Object.keys(object1) |
3 | | - const keys2 = Object.keys(object2) |
| 1 | +function findAllDuplicates(array) { |
| 2 | + const uniq = new Set(array); |
| 3 | + if (uniq.size === array.length) { |
| 4 | + return []; |
| 5 | + } |
| 6 | + const duplicates = new Set() |
| 7 | + for (const element of array) { |
| 8 | + if (uniq.has(element)) { |
| 9 | + uniq.delete(element); |
| 10 | + } else { |
| 11 | + duplicates.add(element); |
| 12 | + } |
| 13 | + } |
| 14 | + return [...duplicates]; |
| 15 | +} |
| 16 | + |
| 17 | +function mergeWith(leftFeatureProps, rightFeatureProps, lsuffix = 'left', rsuffix = 'right') { |
| 18 | + const keys1 = Object.keys(leftFeatureProps) |
| 19 | + const keys2 = Object.keys(rightFeatureProps) |
4 | 20 | const allKeys = [...keys1, ...keys2] |
5 | | - const uniq = [...new Set(allKeys)] |
| 21 | + const duplicates = findAllDuplicates(allKeys) |
6 | 22 | const feature = {} |
7 | | - if (allKeys.length === uniq.length) { |
8 | | - keys1.forEach(key => (feature[key] = object1[key])) |
9 | | - keys2.forEach(key => (feature[key] = object2[key])) |
| 23 | + if (duplicates.length === 0) { |
| 24 | + keys1.forEach(key => (feature[key] = leftFeatureProps[key])) |
| 25 | + keys2.forEach(key => (feature[key] = rightFeatureProps[key])) |
10 | 26 | return feature |
11 | 27 | } else { |
12 | | - const duplicates = allKeys.filter(key => uniq.indexOf(key) === -1) |
13 | 28 | keys1.forEach(key => { |
14 | 29 | if (duplicates.indexOf(key) > -1) { |
15 | | - feature[key + '_' + lsuffix] = object1[key] |
| 30 | + feature[key + '_' + lsuffix] = leftFeatureProps[key] |
16 | 31 | } else { |
17 | | - feature[key] = object1[key] |
| 32 | + feature[key] = leftFeatureProps[key] |
18 | 33 | } |
19 | 34 | }) |
20 | 35 | keys2.forEach(key => { |
21 | 36 | if (duplicates.indexOf(key) > -1) { |
22 | | - feature[key + '_' + rsuffix] = object2[key] |
| 37 | + feature[key + '_' + rsuffix] = rightFeatureProps[key] |
23 | 38 | } else { |
24 | | - feature[key] = object1[key] |
| 39 | + feature[key] = rightFeatureProps[key] |
25 | 40 | } |
26 | 41 | }) |
27 | 42 | return feature |
28 | 43 | } |
29 | 44 | } |
30 | 45 |
|
31 | 46 | export { |
| 47 | + findAllDuplicates, // exported just for testing |
32 | 48 | mergeWith |
33 | 49 | } |
0 commit comments