Другой метод, который начинался как конвейер Рамды, куски которого я заменял по одному, пока не осталось никаких функций Рамды:
const combineStock = (productData, stockData, locationData) => {
const products = productData .reduce ((a, {productId, productName}) => ({...a, [productId]: productName}), {})
const locations = locationData .reduce ((a, {locationId, locationName}) => ({...a, [locationId]: locationName}), {})
const collectStock = (stockLocations) => stockLocations .reduce (
({total, details}, {locationId, stock}) => ({
total: total + stock,
details: [... details, {locationName: locations [locationId], stock}]
}),
{total: 0, details: []}
)
return Object.entries (
Object .entries (
stockData .reduce ((a, {productId, ... rest}) => ({... a, [productId]: [... (a [productId] || []), rest]}), {})
)
.reduce ((a, [k, v]) => ({... a, [k]: collectStock (v)}), {})
)
.map (([productId, stock]) => ({
productName: products [productId],
stock
}))
}
const productData = [{productId: 1000, productName: 'Product 1000'}, {productId: 1001, productName: 'Product 1001'}]
const stockData = [{productId: 1000, locationId: 1, stock: 21}, {productId: 1000, locationId: 2, stock: 8}, {productId: 1001, locationId: 1, stock: 4}, {productId: 1001, locationId: 2, stock: 10}]
const locationData = [{locationId: 1, locationName: 'Location 1'}, {locationId: 2, locationName: 'Location 2'}]
console .log (combineStock (productData, stockData, locationData))
Это происходит в несколько этапов.
Первая строка превращает productData
в нечто подобное:
{1000:"Product 1000", 1001: "Product 1001"}
и следующий делает нечто подобное для locationData
. Это просто облегчает поиск их имен по идентификаторам.
Мы определяем collectStock
помощник, который преобразует массив следующим образом:
[{locationId: 1, stock: 21}, {locationId: 2, stock: 8}]
в это:
{
total: 29,
details: [{locationName: "Location 1", stock: 21}, {locationName: "Location 2", stock: 8}]
}
с использованием поиска locations
.
Остальная часть является основной функцией. Строка stockData .reduce (...)
создает такую структуру:
{
"1000": [{"locationId": 1, "stock": 21}, {"locationId": 2, "stock": 8}],
"1001": [{"locationId": 1, "stock": 4}, {"locationId": 2, "stock": 10}]
}
После того, как мы обернули это Object.entries
и вызвали reduce
для него с вызовом collectStock
, мы получили что-то вроде этого:
{
1000: {
total: 29,
details: [{locationName: "Location 1", stock: 21}, {locationName: "Location 2", stock: 8}]
},
1001: {
total: 14,
details: [{locationName: "Location 1", stock: 4}, {locationName: "Location 2", stock: 10}]
}
}
Затем мы вызываем Object.entries
для этого результата и map
полученные пары в наш окончательный формат, используя поиск products
.