✅ – venus – 09-58 Aug 22

Hello, I'm trying to think of best solution to get previous and next item of selectedState when we fit it inside initialState. Length of selectedState array could be up to the length of initialState. Is there any function that would do it for me, or do I have to write it by myself? Example:
const initialState = [
{ id: 'zero' },
{ id: 'one' },
{ id: 'two' }, // Previous item
{ id: 'three' }, // Existing array
{ id: 'four' }, // Existing array
{ id: 'five' }, // Next item
{ id: 'six' },
];

const selectedState = [
{ id: 'three' },
{ id: 'four' },
];
const initialState = [
{ id: 'zero' },
{ id: 'one' },
{ id: 'two' }, // Previous item
{ id: 'three' }, // Existing array
{ id: 'four' }, // Existing array
{ id: 'five' }, // Next item
{ id: 'six' },
];

const selectedState = [
{ id: 'three' },
{ id: 'four' },
];
So in this case it would be: [{ id: 'two' }, { id: ' five' ].
S
S3BAS605d ago
Will the items in selectedState always be in order next to each other? In other words, something with id three and id five will not exist in selectedState?
V
venus605d ago
It should be always next to each other.
S
S3BAS605d ago
I would do findIndex on the first element of selectedState and then -1 to find previous item, then repeat for the last item of selectedState and +1 the index (take care of the boundaries) Anything that goes in between seems irrelevant
V
venus605d ago
Sometimes it can be like 👇 , so result would be just one item [{ id: 'two' }]
const selectedState = [
{ id: 'zero' },
{ id: 'one' },
];
const selectedState = [
{ id: 'zero' },
{ id: 'one' },
];
S
S3BAS605d ago
Yeah, in that case you look at what index findIndex returns
V
venus605d ago
Yeah I was thinking about something similar. This is what I wrote yest.
Get the first and last item in selectedState, find them in initialState & get -1 item from first and +1 from the last
S
S3BAS605d ago
Yeah, seems like the straight forwarded solution to me
V
venus605d ago
Okay, thank you. I'll keep this thread open to let you know how it goes. Just maybe some little correction of the code at the end.
S
S3BAS605d ago
meowthumbsup
UU
Unknown User605d ago
V
venus605d ago
import compact from "lodash/compact";

export const getNextAndPrevious = <P extends { id: any }>(
initialArr: Array<P>,
selectedArr: Array<P>
) => {
const firstItem = selectedArr[0];
const indexOfFirst = initialArr.findIndex((i) => i.id === firstItem?.id);

if (indexOfFirst === -1) return [];

const previous = initialArr[indexOfFirst - 1];
const next = initialArr[indexOfFirst + selectedArr.length];

return compact([previous, next]); // Removes item if it's `undefined`
};
import compact from "lodash/compact";

export const getNextAndPrevious = <P extends { id: any }>(
initialArr: Array<P>,
selectedArr: Array<P>
) => {
const firstItem = selectedArr[0];
const indexOfFirst = initialArr.findIndex((i) => i.id === firstItem?.id);

if (indexOfFirst === -1) return [];

const previous = initialArr[indexOfFirst - 1];
const next = initialArr[indexOfFirst + selectedArr.length];

return compact([previous, next]); // Removes item if it's `undefined`
};
@Timotius What do you think about this?
UU
Unknown User605d ago
V
venus605d ago
About mine
S
S3BAS605d ago
Nice to use the offset of the selectedArr
V
venus605d ago
Sorry, forgot to edit all variables in the function. I was renaming it here on Discord, to make it more clear
UU
Unknown User605d ago
V
venus605d ago
I did edit this const firstItem = selectedArr[0]; do you have it same?
UU
Unknown User605d ago
V
venus605d ago
Oh, there might be a problem. I realized. Cuz it won't be in order as I thought
const initialState = [
{ id: 'zero' },
{ id: 'one' }, // Previous item
{ id: 'two' }, // Existing array
{ id: 'three' }, // Existing array
{ id: 'four' }, // Existing array
{ id: 'five' }, // Next item
{ id: 'six' },
];

const selectedState = [
{ id: 'three' },
{ id: 'four' },
{ id: 'two' },
];
const initialState = [
{ id: 'zero' },
{ id: 'one' }, // Previous item
{ id: 'two' }, // Existing array
{ id: 'three' }, // Existing array
{ id: 'four' }, // Existing array
{ id: 'five' }, // Next item
{ id: 'six' },
];

const selectedState = [
{ id: 'three' },
{ id: 'four' },
{ id: 'two' },
];
S
S3BAS605d ago
You'll need to find the lowest index then Or highest eg, findIndex for every element
const indices = selectedState.map(elA => initialState.findIndex(elB => elA.id === elB.id))
const minIndive = Math.min(...indices)
const indices = selectedState.map(elA => initialState.findIndex(elB => elA.id === elB.id))
const minIndive = Math.min(...indices)
UU
Unknown User605d ago
V
venus605d ago
How is this meant? Oh nvm, now I can understand
S
S3BAS605d ago
meowthumbsup
UU
Unknown User604d ago