使用原始索引枚举切片数组

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()你可以获得所有数组valueindex! 在此之后使用 .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}