Necesito dividir una matriz y enumerar los valores, pero también necesito la referencia al índice original porque estoy realizando una operación asíncrona que debe volver a asignarse al índice original en la matriz original cuando esté completa.
const array = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']; const slicedArray = array.slice(0, 3).map((v, i) => ({ v, i })); // Returns: [{ "v": "foo", "i": 0 }, { "v": "bar", "i": 1 }, { "v": "baz", "i": 2 }] // Required: [{ "v": "foo", "i": 0 }, { "v": "bar", "i": 1 }, { "v": "baz", "i": 2 }] const slicedArray2 = array.slice(3, 6).map((v, i) => ({ v, i })); // Returns: [{ "v": "qux", "i": 0 }, { "v": "quux", "i": 1 }, { "v": "corge", "i": 2 }] // Required: [{ "v": "qux", "i": 3 }, { "v": "quux", "i": 4 }, { "v": "corge", "i": 5 }]¿Cómo puedo conseguir esto?
Los elementos en el segmento siempre tienen índices que son exactamente startIndex menores que en la matriz original:
slice(0, 3) -> [0, 1, 2] -> [0 - 0, 1 - 0, 2 - 0] slice(3, 6) -> [0, 1, 2] -> [3 - 3, 4 - 3, 5 - 3] slice(n, …) -> [0, 1, …] -> [n + 0 - n, n + 1 - n, n + 2 - n, …] Entonces, simplemente agregar startIndex de nuevo debería hacer el truco:
/** * @template Item * @param {Item[]} items * @param {number} startIndex * @param {number} [endIndex] * @returns {Array<{ item: Item; index: number }>} */ function slice(items, startIndex, endIndex = items.length) { return items.slice(startIndex, endIndex).map((item, index) => ({ item, index: index + startIndex, })); } function slice(items, startIndex, endIndex = items.length) { return items.slice(startIndex, endIndex).map((item, index) => ({ item, index: index + startIndex, })); } const letters = [ ...'abcdefghijklmnopqrstuvwxyz' ]; console.log(slice(letters, 0, 3)); console.log(slice(letters, 3, 6)); console.log(slice(letters, 6, 9));Usando array.map() ¡Puedes obtener todos los value e index la matriz! Después de este uso .slice()
Prueba este código, te ayudará.
const array = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']; const slicedArray2 = array.map((v, i) => ({ v, i })).slice(3, 6); console.log(slicedArray2, 'slicedArray2');De hecho, me gusta más la respuesta aceptada, pero para que conste, otra solución sin la slice
const data = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']; const slice = (items, startIndex, endIndex = items.length) => { return items.reduce((acc, v, i) => { if (i >= startIndex && i < endIndex ) acc.push({ v, i }) return acc; }, []); } console.log(slice(data, 0, 3)); console.log(slice(data, 3)); .as-console-wrapper{min-height: 100%!important; top: 0}