venus
venus3y ago

✅ – 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' ].
24 Replies
S3BAS
S3BAS3y 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?
venus
venus3y ago
It should be always next to each other.
S3BAS
S3BAS3y 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
venus
venus3y 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' },
];
S3BAS
S3BAS3y ago
Yeah, in that case you look at what index findIndex returns
venus
venus3y 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
S3BAS
S3BAS3y ago
Yeah, seems like the straight forwarded solution to me
venus
venus3y 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.
S3BAS
S3BAS3y ago
meowthumbsup
Unknown User
Unknown User3y ago
Message Not Public
Sign In & Join Server To View
venus
venus3y 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?
Unknown User
Unknown User3y ago
Message Not Public
Sign In & Join Server To View
venus
venus3y ago
About mine
S3BAS
S3BAS3y ago
Nice to use the offset of the selectedArr
venus
venus3y ago
Sorry, forgot to edit all variables in the function. I was renaming it here on Discord, to make it more clear