Quiero obtener un segmento de matriz sin un elemento que venga como argumento, pero el segmento debe redondearse. Ver ejemplo para una mejor comprensión.
type Positions = "top" | "right" | "bottom" | "left" const fn = (place : Positions) => { const POSITIONS = ["top", "right", "bottom", "left"] return getSlice(positions, place) } fn("top") // -> ["right","bottom", "left"] fn("right") // -> ["bottom", "left", "top"] fn("bottom") // -> ["left", "top", "right"] fn("right") // -> ["bottom", "left", "top"]Debería funcionar con cualquier longitud de matriz
Puede tomar el índice desde donde desea dividir la matriz.
Luego, cree dos matrices, una a la derecha y otra a la izquierda, usando slice y luego concatenelas .
const fn = (place) => { const positions = ["top", "right", "bottom", "left"]; const index = positions.indexOf(place); return positions.slice(index + 1).concat(positions.slice(0, index)); }; console.log(fn("top")); // ["right","bottom", "left"] console.log(fn("right")); // ["bottom", "left", "top"] console.log(fn("bottom")); // ["left", "top", "right"] console.log(fn("left")); // ['top', 'right', 'bottom']Fragmento mecanografiado a continuación:
type Positions = "top" | "right" | "bottom" | "left"; const fn = (place: Positions): Positions[] => { const positions: Positions[] = ["top", "right", "bottom", "left"]; const index = positions.indexOf(place); return positions.slice(index + 1).concat(positions.slice(0, index)); }; console.log(fn("top")); // ["right","bottom", "left"] console.log(fn("right")); // ["bottom", "left", "top"] console.log(fn("bottom")); // ["left", "top", "right"] console.log(fn("left")); // ['top', 'right', 'bottom'] Nota : Esta respuesta asume que el place pasado a fn es uno de "top" , "right" , "bottom" , "left" .
Puede construir esto encima de una función de cycle más genérica, que simplemente cicla una matriz que comienza en un índice dado. Nuestra función principal puede encontrar el índice en la matriz del valor dado. Si se encuentra, lo llamamos cycle . Si no, devolvemos una copia de la matriz original.
Se parece a esto:
const cycle = (xs, n) => [... xs .slice (n), ... xs .slice (0, n)] const getSlice = (xs, x, i = xs .indexOf (x)) => i > -1 ? cycle (xs, i) .slice (1) : [...xs] const positions = ["top", "right", "bottom", "left"] ; [...positions, "middle"] .forEach ( pos => console .log (`"${pos}" ==> ${JSON.stringify(getSlice (positions, pos))}`) )