vb.net 遍历目录 按日期排序_如何创建,更新和遍历 JavaScript 对象数组

本文介绍如何使用VB.NET遍历目录并按文件日期排序,同时探讨在JavaScript中创建、更新和遍历对象数组的方法,帮助开发者提升文件管理和数据操作能力。
摘要由CSDN通过智能技术生成

81e25886c951d9da3597e5794f237c16.png

我每周平均处理 JSON 数据 18 次,但几乎每次我都需要 Google 搜索特定的方法,如果有一本终极指南可以为我提供答案就好了?

在本文中,我将向你展示在 JavaScript 中使用对象数组的基础知识。

如果你曾经使用过 JSON 结构,那么你就已经使用过 JavaScript 对象。从字面意思看,JSON 代表  JavaScript Object Notation

创建一个对象很简单:

{
  "color": "purple",
  "type": "minivan",
  // 注册日期
  "registration": new Date('2012-02-03'),
  //载人数
  "capacity": 7
}

该对象代表一辆汽车。汽车可以有多种类型和颜色,并且每个对象代表一辆特定的汽车。

e1ea04a4d449ae5f1aeb9fe1e7293237.png

大多数时候你都是从外部服务获取此类数据,但是有时你需要手动创建对象及其数组,就像我创建这个电子商店时一样:

ea76c022f8354afbfab47e97f96b3506.png

每个类别列表项在 HTML 中看起来像这样:

c7b3c624ec9924302b64ad3632733edb.png

但我不想将此代码重复 12 次,因为这很难维护。

创建对象数组

让我们回到汽车的话题上来。我们来看看这些车:

92f461540d0990d93335d50c5c4899bb.png

我们用数组表示它们:

let cars = [
  {
    "color": "purple",
    "type": "minivan",
    "registration": new Date('2017-01-03'),
    "capacity": 7
  },
  {
    "color": "red",
    "type": "station wagon",
    "registration": new Date('2018-03-03'),
    "capacity": 5
  },
  {
    ...
  },
  ...
]

对象数组并非始终保持不变,我们总是需要操作它们。因此,让我们看一下如何将新对象添加到已经存在的数组中。

在头部添加一个新对象 - Array.unshift

be0515b5432ac1d06272e01fc15e028d.png

在头部添加一个对象, 使用  Array.unshift

let car = {
    color: 'red',
    type: 'cabrio',
    registration: new Date('2016-05-02'),
    capacity: 2,
};
cars.unshift(car);

在尾部添加一个新对象 - Array.push

4033721caf146b7e86c2afbd4a1d1515.png

添加一个对象到尾部的位置,使用  Array.push

let car = {
    color: 'red',
    type: 'cabrio',
    registration: new Date('2016-05-02'),
    capacity: 2,
};
cars.push(car);

添加一个新对象到中间位置 - Array.splice

2caf8efc3bd437e5022c319489903165.png

添加一个对象到中间位置,使用  Array.splice。此方法非常方便,因为它也可以删除数组的某一个元素。注意其参数:

Array.splice(
  {index where to start},
  {how many items to remove},
  {items to add}
);

因此,如果我们要在第五个位置添加红色敞篷车,可以像下面这样写:

let car = {
    color: 'red',
    type: 'cabrio',
    registration: new Date('2016-05-02'),
    capacity: 2,
};
cars.splice(4, 0, car);

对象数组的遍历

JavaScript 提供了许多函数/方法,可以解决你的某些问题,从而无需你手动实现其内部逻辑。我们来看看吧。

通过其值在数组中查找特定的对象 - Array.find

如果想在车辆数组中找到一辆红色的,我们可以使用  Array.find

0570d9f88398a7ce0c087c72375dcbcb.png

let car = cars.find((car) => car.color === 'red');

这个函数返回匹配到的第一个元素:

console.log(car);
// output:
// {
//   color: 'red',
//   type: 'station wagon',
//   registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//   capacity: 5
// }

也可以搜索多个值:

let car = cars.find(car => car.color === "red" && car.type === "cabrio");

在这种情况下,我们将获得车辆列表中的最后一辆车。

从数组中获取符合条件的多个元素 - Array.filter

Array.find  方法只返回一个对象。如果你想获取所有红色的车,你需要使用  Array.filter

e5b45f3a245163cc3f58b33d278b76d1.png

let redCars = cars.filter((car) => car.color === 'red');
console.log(redCars);
// output:
// [
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   {
//     color: 'red',
//     type: 'cabrio',
//     registration: 'Sat Mar 03 2012 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 2
//   }
// ]

转换数组的对象 - Array.map

在数组的所有方法中,Array.map方法可以说是我们使用最频繁的了。将对象数组转换为不同对象的数组,这就是  Array.map  的工作。假设我们要根据汽车的大小将其分为三类:

1d5b5b4f13a9501d23de0bc23565cd0b.png

let sizes = cars.map((car) => {
    if (car.capacity <= 3) {
        return 'small';
    }
    if (car.capacity <= 5) {
        return 'medium';
    }
    return 'large';
});
console.log(sizes);
// output:
// ['large','medium','medium', ..., 'small']

如果我们需要更多的值,也可以创建一个新的对象:

let carsProperties = cars.map((car) => {
    let properties = {
        capacity: car.capacity,
        size: 'large',
    };
    if (car.capacity <= 5) {
        properties['size'] = 'medium';
    }
    if (car.capacity <= 3) {
        properties['size'] = 'small';
    }
    return properties;
});
console.log(carsProperties);
// output:
// [
//   { capacity: 7, size: 'large' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 5, size: 'medium' },
//   { capacity: 2, size: 'small' },
//   ...
// ]

向数组的每个对象添加属性 - Array.forEach

Array.map会生成新的数组。那如果我们只想对原来的汽车对象做修改怎么办?这对Array.forEach函数来说是一个很好的使用场景:

cars.forEach((car) => {
    car['size'] = 'large';
    if (car.capacity <= 5) {
        car['size'] = 'medium';
    }
    if (car.capacity <= 3) {
        car['size'] = 'small';
    }
});

按属性对数组排序 - Array.sort

完成对象转换后,通常需要以某种方式对它们进行排序。

通常,排序是基于每个对象都具有的属性的值。我们可以使用Array.sort函数,但是我们需要提供一个定义排序机制的函数(compareFunction)。

译者注:

如果指明了 compareFunction,那么数组会按照调用该函数的返回值排序,即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前。
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注:ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本)。
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

假设我们要根据汽车的载人量对汽车进行降序排序。

dcdafdae6da2c1007d5762bbfcdefcb5.png

let sortedCars = cars.sort((c1, c2) =>
    c1.capacity 1 : c1.capacity > c2.capacity ? -1 : 0
);
console.log(sortedCars);
// output:
// [
//   {
//     color: 'purple',
//     type: 'minivan',
//     registration: 'Wed Feb 01 2017 00:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 7
//   },
//   {
//     color: 'red',
//     type: 'station wagon',
//     registration: 'Sat Mar 03 2018 01:00:00 GMT+0100 (GMT+01:00)',
//     capacity: 5
//   },
//   ...
// ]

如果排序函数的结果为正,则Array.sort比较两个对象,并将第一个对象放在第二位。因此,你可以将排序函数视为一个问题:是否将第一个对象放置在第二个位置。

015aaadc2aaf4d23e81790345adae4aa.png

确保两个对象的比较值相同时始终将大小比较写为零,以避免不必要的交换。

检查数组中的对象是否满足条件 - Array.every,Array.includes

当我们只需要检查每个对象的特定条件时,可使用Array.everyArray.some

汽车清单上有红色敞篷车吗?所有的汽车都能载至少 4 人吗?......

cars.some(car => car.color === "red" && car.type === "cabrio");
// output: true

cars.every(car => car.capacity >= 4);
// output: false

你可能还记得函数Array.includesArray.some类似,但只有元素是原始类型的时候,二者才类似。

总结

在本文中,我们介绍了一些基本函数/方法,这些方法可帮助你创建、操作、转换和遍历对象数组,它们应该涵盖了你遇到的大多数数据处理场景。

如果你遇到更复杂的数组使用场景,请查看  freeCodeCamp 的这篇数组详细指南或参考  W3Schools 的这篇资料。

或者与我联系(Twitter@ondrabus),我可以准备另外一篇文章:-)


原文链接:https://www.freecodecamp.org/news/javascript-array-of-objects-tutorial-how-to-create-update-and-loop-through-objects-using-js-array-methods/

作者:Ondrej Polesny

译者:古月

校对者:水歌

直播活动预告

12.12 周六上午 10:00 - 11:30,思科软件工程师 S1ng S1ng 继续直播做 freeCodeCamp 的 JS 中级算法题目。他会在活动中分析不同的解题思路,帮助大家学习和巩固 JS 基础知识。

大家可以提前在 freeCodeCamp Chat 聊天室和 S1ng S1ng 交流。点击《freeCodeCamp Chat 上线了!欢迎加入中文开发者社区聊天室!》了解如何加入聊天室。

afc6cdc67ab380120a1b543cc977f42f.png

扫码在 freeCodeCamp bilibili 直播间观看

在线翻译工作坊预告

根据目前投票的结果,这周的在线翻译工作坊将于 12.12 周六晚上 19:30 - 21:30 开展。

欢迎大家到时进入会议室(https://meeting.tencent.com/p/3840877398)参与。

详情请查看《freeCodeCamp 在线翻译工作坊丨学编程,练英语,成为开源贡献者》。

3885e0723696c2914bc863c1fba9c406.png

非营利组织 freeCodeCamp.org 自 2014 年成立以来,以“帮助人们免费学习编程”为使命,创建了大量免费的编程教程,包括交互式课程、视频课程、文章等。我们正在帮助全球数百万人学习编程,希望让世界上每个人都有机会获得免费的优质的编程教育资源,成为开发者或者运用编程去解决问题。

你也想成为

freeCodeCamp 社区的贡献者吗

欢迎点击以下文章了解

✨✨

freeCodeCamp 在线翻译工作坊丨学编程,练英语,成为开源贡献者

成为 freeCodeCamp 专栏作者,与世界各地的开发者分享技术知识

点击“阅读原文”

在 freeCodeCamp 专栏阅读更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>