使用原始索引枚举切片数组
Enumerating sliced array using original indices
我需要对数组进行切片并枚举值,但我还需要对原始索引的引用,因为我正在执行一个异步操作,完成后需要将其映射回原始数组中的原始索引。
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 }]
我怎样才能做到这一点?
切片中的项目总是比原始数组中的索引小startIndex
:
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, …]
因此,只需向后添加 startIndex
即可:
/**
* @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));
使用array.map()
你可以获得所有数组value
和index
!
在此之后使用 .slice()
试试这个代码,它对你有帮助
const array = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];
const slicedArray2 = array.map((v, i) => ({ v, i })).slice(3, 6);
console.log(slicedArray2, 'slicedArray2');
我实际上更喜欢接受的答案,但为了记录在案,另一个没有 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}
我需要对数组进行切片并枚举值,但我还需要对原始索引的引用,因为我正在执行一个异步操作,完成后需要将其映射回原始数组中的原始索引。
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 }]
我怎样才能做到这一点?
切片中的项目总是比原始数组中的索引小startIndex
:
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, …]
因此,只需向后添加 startIndex
即可:
/**
* @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));
使用array.map()
你可以获得所有数组value
和index
!
在此之后使用 .slice()
试试这个代码,它对你有帮助
const array = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge'];
const slicedArray2 = array.map((v, i) => ({ v, i })).slice(3, 6);
console.log(slicedArray2, 'slicedArray2');
我实际上更喜欢接受的答案,但为了记录在案,另一个没有 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}