AI can give you what you want, but you should know what you want to achieve anyway.
js
given array A and array B
B is array with objects like {id:string}
write a function which gets - A, changed-B, and previous-B , detects items reorder in B and applies that on a
function applyReorder(a, prevB, changedB) { // Create a map of id to index for the previous b array const prevBIndexMap = new Map() prevB.forEach((item, index) => { prevBIndexMap.set(item.id, index) }) // Create a reordered array based on the changedB array const reorderedA = new Array(a.length) changedB.forEach((item, index) => { const prevIndex = prevBIndexMap.get(item.id) reorderedA[index] = a[prevIndex] }) return reorderedA }
now write that in a more functional style
function applyReorder(a, prevB, changedB) { const prevBIndexMap = prevB.reduce((map, item, index) => { map.set(item.id, index) return map }, new Map()) return changedB.map((item) => a[prevBIndexMap.get(item.id)]) }
use Map constractor
function applyReorder(a, prevB, changedB) { const prevBIndexMap = new Map( prevB.map((item, index) => [item.id, index]) ) return changedB.map((item) => a[prevBIndexMap.get(item.id)]) }
implement this in one line
const applyReorder = (a, prevB, changedB) => changedB.map( (item) => a[ new Map(prevB.map((el, idx) => [el.id, idx])).get( item.id ) ] )
use one line implementation using findIndex
const applyReorder = (a, prevB, changedB) => changedB.map( (item) => a[prevB.findIndex((el) => el.id === item.id)] )
So progressively we got one line instead of 10 and only one implementation was non working
And the final implementation:
function applyReorder( applyTo: any[], prevAccordingTo: { id: string }[], changedAccordingTo: { id: string }[] ) { return changedAccordingTo.map( (item) => applyTo[ prevAccordingTo.findIndex((el) => el.id === item.id) ] ) }
Top comments (0)