I have following array generated from HTML structure:
const sort = [{ section_id: 'b', children: ['2'] }, { section_id: 'a', children: ['1', '3'] }]
each object in this array represents a section, where children is an array of content ids belonging to that section.
There is also a product object:
const product = {
id: 'asd',
title: 'product title',
sections: [
{ id: 'a', title: 'section with id a', contents: [{ id: '1' }] },
{ id: 'b', title: 'section with id b', contents: [{ id: '2' }, { id: '3' }] }
]
}
I would like to "re-create" product object based on data coming from sort, so the result in this example would be like so:
const sortedProduct = {
id: 'asd',
title: 'product title',
sections: [
{ id: 'b', title: 'section with id b', contents: [{ id: '2' }] },
{ id: 'a', title: 'section with id a', contents: [{ id: '1' }, { id: '3' }] }
]
}
I have wrote following function to accomplish just that but first section contains all contents in correct order, rest is just repeat of first one. Please point me to what i'm doing wrong.
const SrtProduct = () => {
const sort = serializeSections() // returns array as in example
let sortedProduct = {}
sortedProduct.sections = []
const emptySection = {
_id: '',
contents: [],
title: ''
}
Object.keys($productStore).forEach(key => {
if(key !== 'sections') sortedProduct[key] = product[key]
})
sort.forEach((section, index) => {
sortedProduct.sections[index] = emptySection
let pozycja = getIndex(product.sections, section.id)
Object.keys(product.sections[index]).forEach(key => {
if(key !== 'contents') sortedProduct.sections[index][key] = product.sections[pozycja][key]
})
if(section.children.length > 0) section.children.forEach((content_id, ind) => {
let poz = getContentIndex(product.sections, content_id)
let tmp = sortedProduct.sections[index]
tmp.contents.push(product.sections[poz[0]].contents[poz[1]])
sortedProduct.sections[index] = tmp
})
})
return sortedProduct
}
Above code returns:
...
sections: [
{ id: 'a', title: 'section with id a', contents: [{id: '2'}, {id: '1'}, {id: '3'}] },
{ id: 'b', title: 'section with id b', contents: [{id: '2'}, {id: '1'}, {id: '3'}] }
]
Helper functions getIndex and getContentIndex both work correctly.
getIndex returns position in array where section with given id is found. ex. getIndex(product.sections, 'b') would return 1
getContentIndex ex. getContentIndex(product.sections, '2') would return [1,0] (section position 1, content position 0)
Input: product, sort
Output sortedProduct which is product with rearranged sections and contents according to information from sort
$productStore, what isgetIndexandgetContentIndex?