Skip to content

Array 数组

alphabetical (按字母顺序排列)

按属性的字母顺序对对象数组进行排序

基本用法

给定一个包含对象的数组和一个回调函数,用于确定用于排序的属性,返回一个按字母顺序排序的新数组。第三个可选参数允许您按降序而不是默认的升序对其进行排序。

对于数字排序,请参见 sort 函数。

ts
import { alphabetical } from "radash";

const gods = [
  {
    name: "Ra",
    power: 100,
  },
  {
    name: "Zeus",
    power: 98,
  },
  {
    name: "Loki",
    power: 72,
  },
  {
    name: "Vishnu",
    power: 100,
  },
];

alphabetical(gods, (g) => g.name); // => [Loki, Ra, Vishnu, Zeus]
alphabetical(gods, (g) => g.name, "desc"); // => [Zeus, Vishnu, Ra, Loki]

boil (沸腾)

将项目列表减少到一个项目

基本用法

给定一个项目数组,返回匹配比较条件的最终项。适用于更复杂的最小/最大值。

ts
import { boil } from "radash";

const gods = [
  {
    name: "Ra",
    power: 100,
  },
  {
    name: "Zeus",
    power: 98,
  },
  {
    name: "Loki",
    power: 72,
  },
];

boil(gods, (a, b) => (a.power > b.power ? a : b));
// => { name: 'Ra', power: 100 }

cluster (集群)

将列表拆分为给定大小的多个列表

基本用法

给定一个项目数组和期望的簇大小 ( n ),返回一个数组的数组。每个子数组包含 n (簇大小) 个项目,尽可能均匀地拆分。

ts
import { cluster } from "radash";

const gods = [
  "Ra",
  "Zeus",
  "Loki",
  "Vishnu",
  "Icarus",
  "Osiris",
  "Thor",
  "Apollo",
  "Artemis",
  "Athena",
];

cluster(gods, 3);
// => [
//   [ 'Ra', 'Zeus', 'Loki' ],
//   [ 'Vishnu', 'Icarus', 'Osiris' ],
//   ['Thor', 'Apollo', 'Artemis'],
//   ['Athena']
// ]

counting(计数)

创建一个具有项目出现次数计数的对象

基本用法

给定一个对象数组和一个身份回调函数来确定每个对象的标识方式。返回一个对象,其中键是回调返回的 id 值,每个值是一个整数,告诉这个 id 出现了多少次。

ts
import { counting } from "radash";

const gods = [
  {
    name: "Ra",
    culture: "egypt",
  },
  {
    name: "Zeus",
    culture: "greek",
  },
  {
    name: "Loki",
    culture: "greek",
  },
];

counting(gods, (g) => g.culture); // => { egypt: 1, greek: 2 }

diff(差异)

创建两个数组之间的差异数组

基本用法

给定两个数组,返回一个数组,其中包含第一个数组中存在但第二个数组中不存在的所有项。

ts
import { diff } from "radash";

const oldWorldGods = ["ra", "zeus"];
const newWorldGods = ["vishnu", "zeus"];

diff(oldWorldGods, newWorldGods); // => ['ra']

first(第一个)

从列表中获取第一个项目

基本用法

给定一个项目数组,如果没有项目存在,则返回第一个项目或默认值。

ts
import { first } from "radash";

const gods = ["ra", "loki", "zeus"];

first(gods); // => 'ra'
first([], "vishnu"); // => 'vishnu'

flat (拍平)

将数组的数组扁平化为一维数组

基本用法

给定一个包含许多数组的数组,返回一个新数组,其中所有子数组中的所有项都出现在顶层。

ts
import { flat } from "radash";

const gods = [["ra", "loki"], ["zeus"]];

flat(gods); // => [ra, loki, zeus]

注意, _.flat 不是递归的,它只会展开第一层。

fork(分叉)

按条件将数组分割成两个数组

基本用法

给定一个项目数组和一个条件,返回两个数组,第一个包含所有通过条件的项目,第二个包含所有未通过条件的项目。

ts
import { fork } from "radash";

const gods = [
  {
    name: "Ra",
    power: 100,
  },
  {
    name: "Zeus",
    power: 98,
  },
  {
    name: "Loki",
    power: 72,
  },
  {
    name: "Vishnu",
    power: 100,
  },
];

const [finalGods, lesserGods] = fork(gods, (f) => f.power > 90); // [[ra, vishnu, zues], [loki]]

group(分组)

对项目数组进行分组排序

基本用法

给定一个项目数组, group 将构建一个对象,其中每个键是属于该组的项目数组。一般来说,这对于对数组进行分类是很有用的。

ts
import { group } from "radash";

const fish = [
  {
    name: "Marlin",
    source: "ocean",
  },
  {
    name: "Bass",
    source: "lake",
  },
  {
    name: "Trout",
    source: "lake",
  },
];

const fishBySource = group(fish, (f) => f.source); // => { ocean: [marlin], lake: [bass, trout] }

intersects(相交)

确定两个数组是否具有共同项

基本用法

给定两个项目数组,如果任何项目存在于两个数组中,则返回 true。

ts
import { intersects } from "radash";

const oceanFish = ["tuna", "tarpon"];
const lakeFish = ["bass", "trout"];

intersects(oceanFish, lakeFish); // => false

const brackishFish = ["tarpon", "snook"];

intersects(oceanFish, brackishFish); // => true

iterate(迭代)

遍历回调函数 n 次

基本用法

有点像 forEach 遇到 reduce 。 用于运行函数 n 次以生成一个值。 _.iterate 函数接受计数(运行回调的次数),回调函数和初始值。回调被作为一个减少函数运行计数次,然后累积的值被返回。

ts
import { iterate } from "radash";

const value = iterate(
  4,
  (acc, idx) => {
    return acc + idx;
  },
  0
); // => 10

注意,这不是从零开始索引的。如果你传递一个 5 的 count ,你将在回调函数中得到 1、2、3、4、5 的索引。

last(最后)

从列表中获取最后一个项目

基本用法

给定一个项目数组,如果没有项目存在,则返回最后一个项目或默认值。

ts
import { last } from "radash";

const fish = ["marlin", "bass", "trout"];

const lastFish = last(fish); // => 'trout'
const lastItem = last([], "bass"); // => 'bass'

list(列表)

使用特定项创建一个列表

基本用法

给定一个开始值、结束值、步长和步长大小,返回一个包含从开始到结束值的值的列表。

接口与 range 相同。

Python 的 range 功能致敬

ts
import { list } from "radash";

list(3); // [0, 1, 2, 3]
list(0, 3); // [0, 1, 2, 3]
list(0, 3, "y"); // [y, y, y, y]
list(0, 3, () => "y"); // [y, y, y, y]
list(0, 3, (i) => i); // [0, 1, 2, 3]
list(0, 3, (i) => `y${i}`); // [y0, y1, y2, y3]
list(0, 3, obj); // [obj, obj, obj, obj]
list(0, 6, (i) => i, 2); // [0, 2, 4, 6]

签名

list 功能可以通过不同的参数实现很多功能。

list(size)

在提供单个参数时,它被视为 size 。返回一个值从 0 到 size 的列表。

ts
list(3); // [0, 1, 2, 3]

list(start, end)

当给定两个参数时,它们被视为 startend 。返回一个由 startend 的值组成的列表。

ts
list(2, 6); // [2, 3, 4, 5, 6]

list(start, end, value)

当给定第三个参数时,它被视为要在列表中使用的 value 。如果 value 是一个函数,它将被调用,带有一个索引参数,以创建每个值。

ts
list(2, 4, {}); // [{}, {}, {}]
list(2, 4, null); // [null, null, null]
list(2, 4, (i) => i); // [2, 3, 4]

list(start, end, value, step)

当给定第四个参数时,它被视为 step 大小,从 startend 生成值时要跳过的。

ts
list(2, 4, (i) => i, 2); // [2, 4]
list(25, 100, (i) => i, 25); // [25, 50, 75, 100]

max(最大值)

从数组中获取最大的项

基本用法

给定一个项目数组和一个获取每个项目值的函数,返回具有最大值的项目。在底层使用 _.boil

ts
import { max } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
    source: "ocean",
  },
  {
    name: "Bass",
    weight: 8,
    source: "lake",
  },
  {
    name: "Trout",
    weight: 13,
    source: "lake",
  },
];

max(fish, (f) => f.weight); // => {name: "Marlin", weight: 105, source: "ocean"}

merge(合并)

组合两个列表,覆盖第一个列表中的项目

基本用法

给定两个项目数组和一个身份函数,返回第一个列表,其中包含第二个列表中所有与之匹配的项目。

ts
import { merge } from "radash";

const gods = [
  {
    name: "Zeus",
    power: 92,
  },
  {
    name: "Ra",
    power: 97,
  },
];

const newGods = [
  {
    name: "Zeus",
    power: 100,
  },
];

merge(gods, newGods, (f) => f.name); // => [{name: "Zeus" power: 100}, {name: "Ra", power: 97}]

min(最小值)

从数组中获取最小的项目

基本用法

给定一个项目数组和一个获取每个项目值的函数,返回具有最小值的项目。在内部使用 _.boil

ts
import { min } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
    source: "ocean",
  },
  {
    name: "Bass",
    weight: 8,
    source: "lake",
  },
  {
    name: "Trout",
    weight: 13,
    source: "lake",
  },
];

min(fish, (f) => f.weight); // => {name: "Bass", weight: 8, source: "lake"}

objectify(对象化)

将列表转换为字典对象

基本用法

给定一个项目数组,使用给定函数创建一个键和值映射的字典。第一个参数是要映射的数组。第二个参数是确定每个项目键的函数。第三个参数是可选的,确定每个项目的值。

ts
import { objectify } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
  },
  {
    name: "Bass",
    weight: 8,
  },
  {
    name: "Trout",
    weight: 13,
  },
];

objectify(fish, (f) => f.name); // => { Marlin: [marlin object], Bass: [bass object], ... }
objectify(
  fish,
  (f) => f.name,
  (f) => f.weight
); // => { Marlin: 105, Bass: 8, Trout: 13 }

range(范围)

创建一个用于迭代的范围

基本用法

给定一个起始值、结束值、步长和值,返回一个生成器,该生成器将按步长从起始值到结束值产生值。用于将 for (let i = 0) 替换为 for of 。Range 将返回一个生成器, for of 将逐个调用,因此可以安全地创建大范围。

接口与 list 相同。

Python 的 range 功能致敬

ts
import { range } from "radash";

range(3); // yields 0, 1, 2, 3
range(0, 3); // yields 0, 1, 2, 3
range(0, 3, "y"); // yields y, y, y, y
range(0, 3, () => "y"); // yields y, y, y, y
range(0, 3, (i) => i); // yields 0, 1, 2, 3
range(0, 3, (i) => `y${i}`); // yields y0, y1, y2, y3
range(0, 3, obj); // yields obj, obj, obj, obj
range(0, 6, (i) => i, 2); // yields 0, 2, 4, 6

for (const i of range(0, 200, 10)) {
  console.log(i); // => 0, 10, 20, 30 ... 190, 200
}

for (const i of range(0, 5)) {
  console.log(i); // => 0, 1, 2, 3, 4, 5
}

签名

range 函数可以使用不同的参数做很多事情。

range(size)

当给定单个参数时,它被视为 size 。返回一个生成器,该生成器产生从 0 到 size 的值。

ts
range(3); // yields 0, 1, 2, 3

range(start, end)

当给定两个参数时,它们被视为 startend 。返回一个生成器,产生从 startend 的值。

ts
range(2, 6); // yields 2, 3, 4, 5, 6

range(start, end, value)

当给定第三个参数时,它被视为要在生成器中生成的 value 。如果 value 是一个函数,它将被调用,并带有索引参数,以创建每个值。

ts
range(2, 4, {}); // yields {}, {}, {}
range(2, 4, null); // yields null, null, null
range(2, 4, (i) => i); // yields 2, 3, 4

range(start, end, value, step)

当给定第四个参数时,它被视为跳过从 startend 生成值时的 step 大小。

ts
range(2, 4, (i) => i, 2); // yields 2, 4
range(25, 100, (i) => i, 25); // yields 25, 50, 75, 100

replaceOrAppend (替换或追加)

替换数组中的项目,如果没有匹配项则追加

基本用法

给定一个项目数组,一个项目和一个身份函数,返回一个新数组,其中项目要么替换现有项目的索引 - 如果存在,否则将其附加到末尾。

ts
import { replaceOrAppend } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
  },
  {
    name: "Salmon",
    weight: 19,
  },
  {
    name: "Trout",
    weight: 13,
  },
];

const salmon = {
  name: "Salmon",
  weight: 22,
};

const sockeye = {
  name: "Sockeye",
  weight: 8,
};

replaceOrAppend(fish, salmon, (f) => f.name === "Salmon"); // => [marlin, salmon (weight:22), trout]
replaceOrAppend(fish, sockeye, (f) => f.name === "Sockeye"); // => [marlin, salmon, trout, sockeye]

replace(替换)

替换数组中的一个项目

基本用法

给定一个项目数组,替换与给定条件函数匹配的项目。只替换第一个匹配项。始终返回原始数组的副本。

ts
import { replace } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
  },
  {
    name: "Bass",
    weight: 8,
  },
  {
    name: "Trout",
    weight: 13,
  },
];

const salmon = {
  name: "Salmon",
  weight: 22,
};

// read: replace fish with salmon where the name is Bass
replace(fish, salmon, (f) => f.name === "Bass"); // => [marlin, salmon, trout]

select(选择)

过滤和映射数组

基本用法

一次性在一个步骤中同时应用过滤器和映射操作。

ts
import { select } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
    source: "ocean",
  },
  {
    name: "Bass",
    weight: 8,
    source: "lake",
  },
  {
    name: "Trout",
    weight: 13,
    source: "lake",
  },
];

select(
  fish,
  (f) => f.weight,
  (f) => f.source === "lake"
); // => [8, 13]

shift(转移)

将数组项向前或向后移动 n 步

基本用法

给定一个项目列表,返回一个向右移动 n 个位置的数组。

ts
import { shift } from "radash";
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
shift(arr, 3); // => [7, 8, 9, 1, 2, 3, 4, 5, 6]

sift(筛选)

从列表中删除所有假值项目

基本用法

给定一个项目列表,返回一个新列表,其中包含所有不为假的项目。

ts
import { sift } from "radash";

const fish = ["salmon", null, false, NaN, "sockeye", "bass"];

sift(fish); // => ['salmon', 'sockeye', 'bass']

sort(排序)

按数字属性对对象列表进行排序

基本用法

给定一个对象数组,通过 get 函数指定的数值属性返回一个新的排序数组。第三个可选参数允许您按降序而不是默认的升序排序。

此函数仅支持数字排序。对于字母排序,请参见字母函数。

ts
import { sort } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
  },
  {
    name: "Bass",
    weight: 8,
  },
  {
    name: "Trout",
    weight: 13,
  },
];

sort(fish, (f) => f.weight); // => [bass, trout, marlin]
sort(fish, (f) => f.weight, true); // => [marlin, trout, bass]

sum(求和)

将数组中的所有项相加

基本用法

给定一个项目数组,并可选地将每个项目映射到一个数字的函数,将所有项目相加。

ts
import { sum } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 100,
  },
  {
    name: "Bass",
    weight: 10,
  },
  {
    name: "Trout",
    weight: 15,
  },
];

sum(fish, (f) => f.weight); // => 125

toggle(切换)

在数组中切换项目的存在

基本用法

如果列表中已经存在与条件匹配的项目,则将其移除。如果不存在,则将其添加。

ts
import { toggle } from "radash";

const gods = ["ra", "zeus", "loki"];

toggle(gods, "ra"); // => [zeus, loki]
toggle(gods, "vishnu"); // => [ra, zeus, loki, vishnu]

toggle(list, item, identity)

您可以传递一个可选的 toKey 函数来确定非原始值的标识。在处理更复杂的数据类型时非常有用。

ts
import { toggle } from "radash";

const ra = { name: "Ra" };
const zeus = { name: "Zeus" };
const loki = { name: "Loki" };
const vishnu = { name: "Vishnu" };

const gods = [ra, zeus, loki];

toggle(gods, ra, (g) => g.name); // => [zeus, loki]
toggle(gods, vishnu, (g) => g.name); // => [ra, zeus, loki, vishnu]

toggle(list, item, identity, options)

默认情况下,如果项目不存在,切换将追加该项目。如果您需要替代选项参数中的 strategy ,则可以将项目前置。

ts
import { toggle } from "radash";

const gods = ["ra", "zeus", "loki"];

toggle(gods, "vishnu", (g) => g, { strategy: "prepend" }); // => [vishnu, ra, zeus, loki]

unique (唯一)

从数组中删除重复项

基本用法

给定一个项目数组 -- 可选的,一个确定它们身份的函数 -- 返回一个没有重复项的新数组。

该函数不保留项目的原始顺序。

ts
import { unique } from "radash";

const fish = [
  {
    name: "Marlin",
    weight: 105,
    source: "ocean",
  },
  {
    name: "Salmon",
    weight: 22,
    source: "river",
  },
  {
    name: "Salmon",
    weight: 22,
    source: "river",
  },
];

unique(fish, (f) => f.name);
// [
//     { name: 'Marlin', weight: 105, source: 'ocean' },
//     { name: 'Salmon', weight: 22, source: 'river' }
// ]

zipToObject

将多个数组合并成集合

基本用法

创建一个对象,将第一个数组中的键映射到第二个数组中相应的值。

ts
import { zipToObject } from "radash";

const names = ["ra", "zeus", "loki"];
const cultures = ["egypt", "greek", "norse"];

zipToObject(names, cultures);
// => { ra: egypt, zeus: greek, loki: norse }

zipToObject(names, (k, i) => k + i);
// => { ra: ra0, zeus: zeus1, loki: loki2 }

zipToObject(names, null);
// => { ra: null, zeus: null, loki: null }

zip

将多个数组合并成集合

基本用法

创建一个分组元素的数组,其中第一个元素包含给定数组的第一个元素,第二个元素包含给定数组的第二个元素,依此类推。

ts
import { zip } from "radash";

const names = ["ra", "zeus", "loki"];
const cultures = ["egypt", "greek", "norse"];

zip(names, cultures);
// => [
//   [ra, egypt]
//   [zeus, greek]
//   [loki, norse]
// ]