Skip to content

array

数组操作工具函数。

导入

typescript
import {
  isArrayLike,
  arrayPick,
  arrayOmit,
  arrayEach,
  arrayEachAsync,
  arrayMove,
  arrayRemove,
  arrayDiff,
  arraySample,
  type ArrayDiffs,
  type ArrayDiffOptions,
  type ArraySampleOptions,
} from '@cloudcome/utils-core/array';

类型定义

ArrayDiffs<T>

数组差异结果类型。

typescript
type ArrayDiffs<T> = {
  deletes: {
    refIndexes: number[];
    refValues: T[];
  }[];
  adds: {
    curIndexes: number[];
    curValues: T[];
  }[];
  equals: {
    refIndexes: number[];
    curIndexes: number[];
    refValues: T[];
    curValues: T[];
  }[];
};

属性说明

属性类型描述
deletesArray被删除的元素列表,包含 refIndexes(参考数组中的索引)和 refValues(被删除的元素值)
addsArray新增的元素列表,包含 curIndexes(当前数组中的索引)和 curValues(新增的元素值)
equalsArray相同的元素列表,包含 refIndexescurIndexesrefValuescurValues

ArrayDiffOptions<T>

数组差异比较的配置选项。

typescript
type ArrayDiffOptions<T> = {
  getItemKey: (item: T) => unknown;
};

属性说明

属性类型描述
getItemKey(item: T) => unknown获取元素唯一标识的函数,默认为元素自身

ArraySampleOptions

数组随机取样的配置选项。

typescript
type ArraySampleOptions = {
  count?: number;
  ordered?: boolean;
  replacement?: boolean;
};

属性说明

属性类型默认值描述
countnumber1取样数量,小数向下取整,负数归零
orderedbooleanfalse是否保持原数组顺序,false 时结果顺序随机
replacementbooleanfalse是否有放回取样,true 时同一元素可能被多次选中

函数

isArrayLike

判断是否为类数组对象。

typescript
function isArrayLike(unknown: unknown): boolean;

参数

参数类型描述
unknownunknown要检查的值

返回值

boolean - 是否为类数组对象

示例

typescript
isArrayLike([1, 2, 3]); // true
isArrayLike({ length: 3 }); // true
isArrayLike('hello'); // false
isArrayLike({}); // false

arrayPick

从数组中选择指定索引的元素。

typescript
function arrayPick<T>(array: T[], indexes: number[]): T[];

参数

参数类型描述
arrayT[]原始数组
indexesnumber[]要选择的索引数组

返回值

T[] - 包含指定索引元素的新数组

示例

typescript
arrayPick(['a', 'b', 'c', 'd'], [0, 2]); // ['a', 'c']

arrayOmit

从数组中排除指定索引的元素。

typescript
function arrayOmit<T>(array: T[], indexes: number[]): T[];

参数

参数类型描述
arrayT[]原始数组
indexesnumber[]要排除的索引数组

返回值

T[] - 排除指定索引元素后的新数组

示例

typescript
arrayOmit(['a', 'b', 'c', 'd'], [0, 2]); // ['b', 'd']

arrayEach

遍历数组中的每个元素。

typescript
function arrayEach<T>(array: T[], iterator: (item: T, index: number) => false | unknown, reverse?: boolean): void;

参数

参数类型默认值描述
arrayT[]-要遍历的数组
iterator(item: T, index: number) => false | unknown-回调函数,返回 false 可提前终止
reversebooleanfalse是否反向遍历

返回值

void

示例

typescript
const arr = [1, 2, 3, 4, 5];

arrayEach(arr, (item, index) => {
  console.log(item, index);
  if (index === 2) return false; // 提前终止
});
// 1 0
// 2 1
// 3 2

// 反向遍历
arrayEach(arr, (item) => console.log(item), true);
// 5, 4, 3, 2, 1

arrayEachAsync

异步遍历数组中的每个元素。

typescript
function arrayEachAsync<T>(
  array: T[],
  iterator: (item: T, index: number) => MaybePromise<false | unknown>,
  reverse?: boolean,
): Promise<void>;

参数

参数类型默认值描述
arrayT[]-要遍历的数组
iterator(item: T, index: number) => MaybePromise<false | unknown>-异步回调函数,返回 false 可提前终止
reversebooleanfalse是否反向遍历

返回值

Promise<void>

示例

typescript
const arr = [1, 2, 3];

await arrayEachAsync(arr, async (item, index) => {
  await promiseDelay(100);
  console.log(item);
});
// 1, 2, 3(依次输出,每次间隔 100ms)

arrayMove

将数组中的元素移动到指定位置。

typescript
function arrayMove<T>(array: T[], from: number, to: number): T[];

参数

参数类型描述
arrayT[]原始数组
fromnumber要移动元素的起始索引
tonumber目标索引

返回值

T[] - 移动后的新数组

示例

typescript
arrayMove([1, 2, 3, 4, 5], 1, 3); // [1, 3, 4, 2, 5]

边界情况

typescript
// 索引越界时返回原数组副本
arrayMove([1, 2, 3], -1, 1); // [1, 2, 3]
arrayMove([1, 2, 3], 0, 5); // [1, 2, 3]
arrayMove([1, 2, 3], 5, 0); // [1, 2, 3]

arrayRemove

从数组中移除指定索引的元素。

typescript
function arrayRemove<T>(array: T[], indexes: number[]): T[];

参数

参数类型描述
arrayT[]原始数组
indexesnumber[]要移除的索引数组

返回值

T[] - 移除后的新数组

示例

typescript
arrayRemove([1, 2, 3, 4, 5], [1, 3]); // [1, 3, 5]
arrayRemove(['a', 'b', 'c'], [0]); // ['b', 'c']

arrayDiff

比较两个数组的差异。

typescript
function arrayDiff<T>(refArray: T[], curArray: T[], options?: ArrayDiffOptions<T>): ArrayDiffs<T>;

参数

参数类型描述
refArrayT[]参考数组(原始数组)
curArrayT[]当前数组(比较数组)
optionsArrayDiffOptions<T>可选,配置选项

返回值

ArrayDiffs<T> - 包含差异信息的对象

示例

typescript
const ref = [1, 2, 3];
const cur = [2, 3, 4];
const diff = arrayDiff(ref, cur);
// {
//   deletes: [{ refIndexes: [0], refValues: [1] }],
//   adds: [{ curIndexes: [2], curValues: [4] }],
//   equals: [
//     { refIndexes: [1], curIndexes: [0], refValues: [2], curValues: [2] },
//     { refIndexes: [2], curIndexes: [1], refValues: [3], curValues: [3] }
//   ]
// }

// 使用自定义 key 函数
const ref2 = [{ id: 1 }, { id: 2 }];
const cur2 = [{ id: 2 }, { id: 3 }];
const diff2 = arrayDiff(ref2, cur2, { getItemKey: (item) => item.id });

arraySample

从数组中随机取样指定数量的元素。

typescript
function arraySample<T>(array: T[], options?: ArraySampleOptions): T[];

类型参数

参数约束描述
T-元素类型

参数

参数类型描述
arrayT[]原始数组
optionsArraySampleOptions可选配置

返回值

T[] - 取样结果的新数组(始终返回数组,即使只取 1 个元素)

示例

typescript
const arr = [1, 2, 3, 4, 5];

// 默认取 1 个元素
arraySample(arr);
// => [3]

// 无序、无放回取 3 个
arraySample(arr, { count: 3 });
// => [5, 1, 3]

// 保持顺序、无放回
arraySample(arr, { count: 3, ordered: true });
// => [1, 3, 4]

// 有放回取样,可能重复
arraySample(arr, { count: 3, replacement: true });
// => [4, 2, 4]

// 保持顺序且有放回
arraySample(arr, { count: 3, ordered: true, replacement: true });
// => [1, 1, 3]

边界情况

typescript
// count 为小数向下取整
arraySample(arr, { count: 2.7 });
// => [2, 5]

// count 为 0 或负数返回空数组
arraySample(arr, { count: 0 });
// => []

// 空数组始终返回空数组
arraySample([]);
// => []

// 无放回时 count 大于数组长度返回全部
arraySample(arr, { count: 10 });
// => [3, 1, 5, 2, 4](全部 5 个元素,顺序随机)

// 不修改原数组
arr; // [1, 2, 3, 4, 5](不变)

基于 MIT 许可发布