JavaScript array filter - 在 JavaScript 中过滤数组

位置:首页>文章>详情   分类: Web前端 > 编程技术   阅读(387)   2023-06-26 07:54:31

JavaScript 数组过滤器教程展示了如何在 JavaScript 中过滤数组。过滤器函数创建一个新数组,其中包含所有通过谓词函数的元素。

数组是许多值的集合。数组项称为数组的元素。

谓词

一般意义上的谓词是关于某事是真还是假的陈述。在编程中,谓词表示返回布尔值的单参数函数。

JS过滤函数

filter 函数创建一个新数组,其中包含满足给定谓词的所有元素。

filter(predicate, [ctx])

filter 函数将谓词作为其第一个参数。第二个参数是可选的;它是一个辅助上下文对象。在谓词内部,我们可以使用 this 关键字访问上下文对象的属性。

JS 数组过滤器示例

在第一个示例中,我们过滤数组中的数字。

positive.js
let nums = [4, -5, 3, 2, -1, 7, -6, 8, 9];

let pos_nums = nums.filter((e) => e > 0);
console.log(pos_nums);

我们有一组数字。使用 filter 函数,我们创建了一个仅包含正数的新数组。

let pos_nums = nums.filter((e) => e > 0);

在这种情况下,谓词是一个匿名函数,它为大于零的值返回 true。

$ node positive.js 
[ 4, 3, 2, 7, 8, 9 ]

JS数组过滤上下文

在下一个示例中,我们在过滤中使用上下文对象。

filter_range.js
function isInRange(val) {

    return val >= this.lower && val <= this.upper;
}

let range = {
    lower: 1,
    upper: 10
};

let data = [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];

let res = data.filter(isInRange, range);
console.log(res);

我们有一组值。我们在上下文对象中指定过滤的下限和上限。

function isInRange(val) {

    return val >= this.lower && val <= this.upper;
}

我们通过 this 关键字访问上下文的属性。

let range = {
    lower: 1,
    upper: 10
};

这是上下文对象。

let res = data.filter(isInRange, range);

我们将上下文作为第二个参数传递。

$ node filter_range.js 
[
  1, 2, 3, 4,  5,
  6, 7, 8, 9, 10
]

JS数组过滤器数据类型

typeof 运算符返回一个字符串,指示操作数的类型。

filter_datatype.js
function isNumber(value) {

    if (typeof value === 'number') {
        return true;
    }
}

let data = [10, null, "30", 1.4, 'falcon', undefined, true, 17];

let res = data.filter(isNumber);
console.log(res);

在示例中,data 数组包含各种数据类型的元素。我们过滤掉所有数字。

function isNumber(value) {

    if (typeof value === 'number') {
        return true;
    }
}

isNumber 谓词中,我们使用 typeof 运算符检查数值。

$ node filter_datatype.js 
[ 10, 1.4, 17 ]

JS数组过滤对象

我们有一个对象数组。我们根据对象属性过滤数组。

filter_by_city.js
const users = [
  { name: 'John', city: 'London', born: '2001-04-01' },
  { name: 'Lenny', city: 'New York', born: '1997-12-11' },
  { name: 'Andrew', city: 'Boston', born: '1987-02-22' },
  { name: 'Peter', city: 'Prague', born: '1936-03-24' },
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' },
  { name: 'Adam', city: 'Trnava', born: '1983-12-01' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' },
  { name: 'Robert', city: 'Prague', born: '1998-03-14' }
];


let res = users.filter(user => user.city === 'Bratislava');
console.log(res);

该示例过滤掉居住在布拉迪斯拉发的所有用户。

$ node filter_by_city
[
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' }
]

我们可以通过多个属性过滤对象。

filter_by_city_name.js
const users = [
  { name: 'John', city: 'London', born: '2001-04-01' },
  { name: 'Lenny', city: 'New York', born: '1997-12-11' },
  { name: 'Andrew', city: 'Boston', born: '1987-02-22' },
  { name: 'Peter', city: 'Prague', born: '1936-03-24' },
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' },
  { name: 'Adam', city: 'Trnava', born: '1983-12-01' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' },
  { name: 'Robert', city: 'Prague', born: '1998-03-14' }
];

let res = users.filter(user => user.city === 'Bratislava' && user.name.startsWith('A'));
console.log(res);

我们过滤所有居住在布拉迪斯拉发且名字以“A”开头的用户。

$ node filter_by_city_name.js 
[
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' }
]

在下一个示例中,我们将按年龄过滤。为此,我们需要 moment 库。

$ nmp i moment

我们安装 moment 库。

filter_by_age.js
const moment = require('moment');

const users = [
  { name: 'John', city: 'London', born: '2001-04-01' },
  { name: 'Lenny', city: 'New York', born: '1997-12-11' },
  { name: 'Andrew', city: 'Boston', born: '1987-02-22' },
  { name: 'Peter', city: 'Prague', born: '1936-03-24' },
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' },
  { name: 'Adam', city: 'Trnava', born: '1983-12-01' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' },
  { name: 'Robert', city: 'Prague', born: '1998-03-14' }
];

let res = users.filter(user => getAge(user.born) > 40);

console.log(res);


function getAge(dt) {

    return moment.duration(moment() - moment(dt, 'YYYY-MM-DD', true)).years();
}

该示例过滤掉所有 40 岁以上的用户。

$ node filter_by_age.js 
[
  { name: 'Peter', city: 'Prague', born: '1936-03-24' },
  { name: 'Anna', city: 'Bratislava', born: '1973-11-18' },
  { name: 'Albert', city: 'Bratislava', born: '1940-12-11' },
  { name: 'Robert', city: 'Bratislava', born: '1935-05-15' }
]

在本文中,我们介绍了 JavaScript 数组的过滤。

地址:https://www.cundage.com/article/javascript-array-filter.html

相关阅读

Big.js 教程展示了如何使用 Big.js 模块在 JavaScript 中使用任意精度的大十进制算法。 大.js 大.js 是一个小型、快速的 JavaScript 库,用于任意精度的十进...
faker.js 教程展示了如何使用 faker.js 库在 JavaScript 中生成虚假数据。 伪造者.js 伪造者.js 是一个用于生成假数据的 JavaScript 库。构建和测试我们...
Node.js 教程是 Node.js 的入门教程。我们描述了 Node.js 并提供了一些 Node.js 代码示例。 Nojde.js 节点.js 是一个开源、跨平台的 JavaScript...
JavaScript 数组教程展示了如何在 JavaScript 中使用数组。 数组是许多值的集合。数组项称为数组的元素。每个元素都可以通过索引引用。数组是从零开始的。 JavaScript 数...
Liquid.js 教程展示了如何在 JavaScript 应用程序中使用 Liquid 模板引擎。 液体 液体 是一个 JavaScript 模板引擎。它是由 Shopify 创建的。 Liq...
Rollup.js 教程展示了如何使用 Rollup.js 模块打包器。 卷起 是一个 JavaScript 模块打包器。它将较小的代码片段编译成较大的库或应用程序包
Moment.js 教程展示了如何使用 Moment.js 模块在 JavaScript 中处理日期和时间。 时刻.js 时刻.js 是一个轻量级的 JavaScript 日期库,用于解析、验证...
Day.js 教程展示了如何使用 Day.js 模块在 JavaScript 中处理日期和时间。 日.js Day.js 是一个极简主义的 JavaScript 日期库,用于解析、验证、操作和格...
JavaScript JSON.parse 教程展示了如何将 JSON 字符串解析为 JavaScript 对象。 JSON JSON(JavaScript 对象显示法) 是一种轻量级数据交换格...
在本教程中,我们展示了如何在 JavaScript 中创建和使用模块。 模块 是 JavaScript 代码的容器。模块在单独的文件中定义。模块的目的是组织和隔离代码。 JavaScript 多...