如何在 jQuery 中循环遍历数组?

2023-11-23

我正在尝试循环遍历一个数组。我有以下代码:

 var currnt_image_list= '21,32,234,223';
 var substr = currnt_image_list.split(','); // array here

我正在尝试从数组中获取所有数据。有人可以引导我走上正确的道路吗?



(更新:我的其他答案在这里更彻底地列出非 jQuery 选项。下面第三个选项,jQuery.each,但不在其中。)


四种选择:

通用循环:

var i;
for (i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

或者在 ES2015+ 中:

for (let i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

优点:直接,不依赖 jQuery,易于理解,不存在保留含义的问题this在循环体内,没有不必要的函数调用开销(例如,theory更快,尽管事实上你必须有太多的元素,以至于你很可能会遇到其他问题;details).

ES5's forEach:

从 ECMAScript5 开始,数组有一个forEach对它们使用函数,这使得循环遍历数组变得容易:

substr.forEach(function(item) {
    // do something with `item`
});

链接到文档

(注意:还有很多其他功能,不仅仅是forEach; see 上面提到的答案了解详情。)

优点:声明式,如果您有一个方便的迭代器,可以使用迭代器的预构建函数,如果您的循环体很复杂,函数调用的范围有时很有用,不需要i包含范围内的变量。

缺点: 如果你正在使用this在包含的代码中并且您想要使用this在你的forEach回调,你必须 A) 将它放在一个变量中,这样你就可以在函数中使用它,B) 将它作为第二个参数传递给forEach so forEach将其设置为this在回调期间,或 C) 使用 ES2015+箭头函数,结束this。如果您不执行其中一项操作,则在回调中thisundefined(在严格模式下)或全局对象(window)处于松散模式。曾经有第二个缺点forEach并未得到普遍支持,但在 2018 年,您将遇到的唯一一个不支持该功能的浏览器forEach是IE8(而且不可能是properly那里也有聚填充)。

ES2015+ 的for-of:

for (const s of substr) { // Or `let` if you want to modify it in the loop body
    // do something with `s`
}

有关其工作原理的详细信息,请参阅此答案顶部链接的答案。

优点:简单、直接,为数组中的条目提供包含范围变量(或上面的常量)。

缺点:任何版本的 IE 均不支持。

jQuery.each:

jQuery.each(substr, function(index, item) {
    // do something with `item` (or `this` is also `item` if you like)
});

(链接到文档)

优点:具有与以下所有相同的优点forEach,而且您知道它就在那里,因为您使用的是 jQuery。

缺点: 如果你正在使用this在包含的代码中,您必须将其粘贴在变量中,以便可以在函数中使用它,因为this表示函数内的其他内容。

您可以避免this不过,通过使用$.proxy:

jQuery.each(substr, $.proxy(function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}, this));

...or Function#bind:

jQuery.each(substr, function(index, item) {
    // do something with `item` (`this` is the same as it was outside)
}.bind(this));

...或者在 ES2015(“ES6”)中,箭头函数:

jQuery.each(substr, (index, item) => {
    // do something with `item` (`this` is the same as it was outside)
});

What NOT to do:

Don't use for..in为此(或者如果您这样做,请采取适当的保护措施)。你会看到人们这么说(事实上,这里有一个简单的答案这么说),但是for..in并没有做很多人认为它做的事情(它做了一些更有用的事情!)。具体来说,for..in循环遍历对象的可枚举属性名称(而不是数组的索引)。由于数组是对象,并且它们唯一的可枚举属性默认情况下是索引,它似乎主要在平淡的部署中工作。但这并不是一个安全的假设,你可以用它来实现这一点。这是一个探索:http://jsbin.com/exohi/3

我应该软化上面的“不要”。如果您正在处理稀疏数组(例如,该数组总共有 15 个元素,但由于某种原因它们的索引分布在 0 到 150,000 的范围内,因此length是 150,001),and如果您使用适当的保护措施,例如hasOwnProperty并检查属性名称是否确实是数字(请参阅上面的链接),for..in可以是避免大量不必要循环的完全合理的方法,因为只会枚举填充的索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 jQuery 中循环遍历数组? 的相关文章

随机推荐

  • 每次表单输入字段更改时如何发送 ajax 请求?

    例如 有一个输入字段 每次用户在该字段中键入一个键时 它都会发送一个 AJAX 请求 其中包含当前输入中的任何文本 并对其执行某些操作 我研究了 Jquery 中的更改和 keyup 函数 但是当我在 Jsfiddle 中尝试它们时 它们没
  • 如何使用 jQuery.Ajax 访问 400 错误的 JSON 响应?

    在 jQuery 中 我将表单提交到服务器 当出现验证错误时 我会从服务器收到 400 错误 并且文档正文是有效的 JSON 我想知道如何访问从服务器返回的数据 我的 jQuery Ajax 对象上的 error 回调函数从未被调用 因此我
  • 使用 Android 应用程序更改网络运营商

    我正在尝试开发一个Android应用程序 它可以在地图上显示各个网络运营商的信号强度 问题是改变网络运营商的唯一方法是手动操作 关于如何在不手动更改的情况下获取此信息的任何想法 我认为有内部 私有 Android 类可以做到这一点 您将需要
  • Laravel 中的多线程

    我遇到了一个问题 我的数据库调用显着减慢了页面加载速度 我正在从选举数据填充多个图表 我的表包含大约 100 万行 我必须在每个方法中多次查询这些数据getCharts method I am 使用这个将返回数据传递给 JavaScript
  • Log4J2 AppenderLoggingException NoSuchMethodError StackLocatorUtil.getCurrentStackTrace()

    一旦发生异常 错误并且应该被记录 我就会收到以下错误 堆栈跟踪 org apache logging log4j core appender AppenderLoggingException java lang NoSuchMethodEr
  • iPhone 应用程序中的密码加密

    我需要将用户的密码存储在我的 iPhone 应用程序中 当将应用程序发布到应用程序商店时 我必须告诉Apple该应用程序中是否有出于导出目的的加密 我不希望我的应用程序仅限于美国 但我也不希望以明文形式通过网络存储或发送密码 所以基本上问题
  • v6 中可选参数的替代方法

    在 v5 中 我们可以添加尾随 路由可选参数 但与 v6 一样 对相同参数的支持已被删除 那么编写以下代码的替代方法是什么
  • 如何使用Log4Net实现日志文件自动归档

    我想以这样的方式配置 log4net 以便自动归档前一天的所有日志 是否有可能在 Log4Net 中自动存档以前的日志 我只想使用配置来执行此操作 而不使用任何第三方库 如 Sharplibzip 编写任何代码来创建存档 通过归档还要添加一
  • C# 正确格式化(缩进、对齐)C#

    我们有一个代码生成器munges给定数据库的模式 用于自动化我们内部的 n 层架构 输出是各种 C 部分类 每个文件一个 在处理所有字符串的代码中 我们尝试尽可能地控制缩进和格式 但当您在 Visual Studio 中打开文件时 格式总是
  • 逐行读取文件并分割值

    我需要读取一个txt文件 其组成如下 AA 1000 AA 320009 999999 AA 1011 AA 320303 111111 对于每个读取的行 我需要用 将其分割以到达第一回合 test 0 AA 1000 AA 320009
  • 调用 savechanges 时实体框架复制

    我首先使用entityframework 5代码 我有一个这样的模型 class Product public Product Fabrics new BindingList
  • 如何在Spring 3.0应用程序中配置Hibernate统计信息?

    我们如何配置以便在基于 Spring MVC 的 Web 应用程序中通过 JMX 获取 Hibernate 统计信息 有没有更好的方法来跟踪 Hibernate 性能 Set hibernate generate statistics to
  • Cakephp 2.0 使用电子邮件而不是用户名进行身份验证

    在我看来我有 在我的应用程序控制器中 public components array
  • ZF2中同一模块下的多个命名空间

    我在同一模块下配置多个命名空间 类时遇到问题 例如 我有一个名为 Account 的模块 其中我想包含所有与帐户相关的类 公司 accounts 用户 users 外部 api api 等 模块结构看起来像这样 Account Module
  • Base64 图像不显示在 RDLC 报告的渲染 PDF 上

    我正在尝试使用参数 CustomerSign 在 RDLC 报告中 我正在从报告中渲染 PDF 文件 并且看到 PDF 文件 我已配置图像属性如下 选择图像源 Database 使用该字段 Convert FromBase64String
  • 为什么 Objects.hash() 对于相同的输入返回不同的值?

    我运行了以下脚本 java 它给了我奇怪的结果 有谁可以帮忙解释一下吗 import java util Objects import org apache log4j Logger public class CacheTester pri
  • -D MACRO 和 #define MACRO 的优先级

    如果我有一个C文件 foo c 虽然我已经给出了 DMACRO 1作为编译的命令行选项 但是 如果在头文件中我也有 define MACRO 2 其中哪一个会优先 我正在假设您正在做什么 但是如果您想从命令行为该宏提供非默认值 请尝试对宏定
  • 多线程访问文件

    我们有一个多线程java程序 多个线程将写入一个文件 一个线程将从该文件中读取 我正在寻找一些设计想法 是否需要同步 文件通道理论上是线程安全的 来自javadoc 文件通道可供多个并发线程安全使用 这 close 方法可以随时调用 具体由
  • 读取套接字时Java中断线程[重复]

    这个问题在这里已经有答案了 可能的重复 如何立即终止阻塞在套接字IO操作上的线程 我有一个客户端在线程中运行 想要从 Java 中的套接字读取数据 但在阅读时 也许我想杀死线程 所以我interrupt它 但是套接字的读取方法会抛出异常吗I
  • 如何在 jQuery 中循环遍历数组?

    我正在尝试循环遍历一个数组 我有以下代码 var currnt image list 21 32 234 223 var substr currnt image list split array here 我正在尝试从数组中获取所有数据 有