检查对象是否类似于数组

2023-12-26

有没有办法检查一个对象是否是“类似数组”,就像这些类型的对象一样:

  • 数组(废话)
  • 类型化数组(Uint8Array 等),当Array.isArray is used
  • 参数对象
  • 节点列表*
  • 还有一些我一时想不起来的

我想你可以检查是否存在.length属性,但非类数组对象可以包含.length财产。我想这些的共同点是数组访问器。


正如我在该主题的研究中所发现的那样,您只有几个选择:

  1. 你只能看.length属性并接受任何似乎具有适当属性的对象.length属性不是您知道应该消除的任何其他东西(例如函数)。

  2. 您可以检查特定的类似数组的对象(HTMLCollection, nodeList)并偏向于他们。

第一种方法有两个选项 - 一个不接受零长度,一个接受零长度(这些包含 gilly3 的建议以及我们在 jQuery 类似函数中看到的内容):

// see if it looks and smells like an iterable object, but don't accept length === 0
function isArrayLike(item) {
    return (
        Array.isArray(item) || 
        (!!item &&
          typeof item === "object" &&
          item.hasOwnProperty("length") && 
          typeof item.length === "number" && 
          item.length > 0 && 
          (item.length - 1) in item
        )
    );
}

这当然是报道false对于带有.length === 0,如果你想允许.length === 0,那么逻辑也可以包含该情况。

// see if it looks and smells like an iterable object, and do accept length === 0
function isArrayLike(item) {
    return (
        Array.isArray(item) || 
        (!!item &&
          typeof item === "object" &&
          typeof (item.length) === "number" && 
          (item.length === 0 ||
             (item.length > 0 && 
             (item.length - 1) in item)
          )
        )
    );
}

一些测试用例:http://jsfiddle.net/jfriend00/3brjc/ http://jsfiddle.net/jfriend00/3brjc/

2)检查它不是一个实际的数组后,您可以编写代码来检查特定类型的类似数组的对象(例如nodeList, HTMLCollection).

例如,当我想确保包含 nodeList 和 HTMLCollection 类似数组的对象时,我使用以下方法:

// assumes Array.isArray or a polyfill is available
function canAccessAsArray(item) {
    if (Array.isArray(item)) {
        return true;
    }
    // modern browser such as IE9 / firefox / chrome etc.
    var result = Object.prototype.toString.call(item);
    if (result === "[object HTMLCollection]" || result === "[object NodeList]") {
        return true;
    }
    //ie 6/7/8
    if (typeof item !== "object" || !item.hasOwnProperty("length") || item.length < 0) {
        return false;
    }
    // a false positive on an empty pseudo-array is OK because there won't be anything
    // to iterate so we allow anything with .length === 0 to pass the test
    if (item.length === 0) {
        return true;
    } else if (item[0] && item[0].nodeType) {
        return true;
    }
    return false;        
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查对象是否类似于数组 的相关文章

  • 在哪里可以找到 Java 数组的源代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以找到java数组的源代码 Example double arr new double 20
  • Firebase,只得到新的孩子[重复]

    这个问题在这里已经有答案了 var firebase new Firebase firebaseRef on child added function snapshot 这将接收所有元素 有没有办法在创建新的 Firebase 引用时不接收
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • 如何获得n个具有不同元素数量的数组的所有可能组合?

    我有一些在编程时未知的数组数量 也许是 3 或 4 或 7 每个数组都有一些元素 即 a 1 2 3 4 b 6 7 5 2 1 c 22 4 6 8 4 8 5 4 d e f g 我想通过从每个数组中采样一个数字来获得所有可能的组合 例
  • 如何使用 Greasemonkey 监视静态 HTML 页面的更改?使用哈希?

    我希望我的 Greasemonkey 脚本仅在其访问的静态页面具有与以前完全相同的内容时运行 现在我可以设置一个包含该页面哈希的变量 我正在寻找一种动态散列页面的方法 以便我可以将我的散列与生成的散列进行比较 关于如何即时实现散列的任何想法
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 使用 Google 日历源时如何禁用 FullCalendar 中的活动链接?

    我正在使用 FullCalendar 库从 Google 日历加载日历中的事件 不幸的是 事件添加到日历后 它们是可点击的 当您点击该活动时 您会自动重定向到 Google 日历页面以查看该特定活动 或者如果您有足够的访问权限 则可以直接对
  • LeafleteachLayer函数不会迭代所有Layer

    使用 GeoJSON 数据数组创建一些标记 getJSON GetLocationsServlet function data L geoJSON data onEachFeature onEachFeature addTo mymap G
  • Vaadin 12 将对象传递给 JavaScript 函数:无法对类进行编码

    Vaadin 12 Kotlin 项目 In my myPage html我有JavaScript myObject redirectToCheckout sessionId 1111 2222 所以我需要调用javaScript函数red
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • Google Maps API (v3) 添加/更新标记

    编辑 它现在可以工作 但如果用户不允许或没有基于位置的服务 则不会加载 请参阅 jsfiddle 示例接受的答案评论 我已经浏览了一些教程和问题 但我无法安静地理解正在发生的事情 或者在这种情况下 没有发生 当用户单击链接时 我正在加载地图
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • Highcharts jQuery 渲染问题 - 所有浏览器

    我在尝试使用构建堆积柱形图时遇到了一个奇怪的问题高图表 http www highcharts com 当图表呈现时 在您调整浏览器大小之前 不会显示列无论如何 导致图表重绘 我认为 图表的其余部分显示 轴 标题等 但不显示列本身 我在 I
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • 将数组从 jquery ajax 传递到代码后面

    我必须将二维数组传递给在asp net网页代码后面编写的页面方法我有一个变量objList作为二维数组 我使用以下代码来实现此目的 但没有成功 并且未调用页面方法 脚本语言 function BindTable objList ajax u
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供

随机推荐

  • 从肥皂信封 zeep 获取数据

    我正在尝试在 python 库的帮助下使用 wsdlzeep https github com mvantellingen python zeep 它工作正常 但我不知道如何从请求中获取数据 My code encoding utf 8 f
  • 最小高度不适用于身体

    min height 不适用于 body html 吗 body html min height 100 绝对没有完成任何事情 firebug 报告正文 html 标签高度根本没有改变 首先 声明一个文档类型 以便您符合标准 如果您还没有这
  • 64位MFC版本中的访问冲突异常

    我正在尝试将 32 位应用程序移植到 64 位 计算似乎运行正确 但我无法正确配置视图 我在 W7 x64 机器上的 VS2005 中使用 MFC C 和 OpenGL Intel 10 0 027 编译器 发生崩溃时 我收到以下消息 3D
  • 跨实现确定性数组#shuffle

    可以将随机数生成器传递给Array shuffle这使得洗牌具有确定性 例如 在 MRI 1 9 3p327 中 1 2 3 4 shuffle random Random new 0 gt 1 2 4 3 1 2 3 4 shuffle
  • 使用 BeautifulSoup 抓取一系列表

    我正在尝试学习网络抓取和Python 以及相关的编程 并且发现了BeautifulSoup库 它似乎提供了很多可能性 我试图找出如何最好地从此页面提取相关信息 http www aidn org au Industry ViewCompan
  • 使用 AutoIt 循环解析 CSV 文件的所有行

    我有以下代码来读取包含两行数据的 csv 文件 我不知道这是怎么回事 如何改进它以读取包含两行数据的 csv 文件 include
  • 如何在Powerpoint VBA中运行宏“OnEnterSlide”或“OnLeaveSlide”?

    是否有某种事件允许在进入幻灯片或离开幻灯片时运行宏 SlideShowNextSlide 或 OnSlideShowPageChange 您可以在以下位置找到完整列表 http officeone mvps org vba events v
  • Android Room @Relation 多对多?

    我正在开发一个 Android 应用程序 并在 Android 操作系统中使用新的架构组件 LiveData ViewModel 和 Room 我在 Room 实现中遇到一个关于创建 Relation 的小问题 该 Relation 返回
  • 如何修复“java.sql.SQLException:数据库已关闭”问题

    我的代码说没有错误 但是当我运行该程序时 它会说数据库已关闭 public class main public static void main String args language SQLite String sql SELECT F
  • 用户管理API

    我正在开发一个应用程序套件 用户需要连接到服务器 并根据他们的帐户类型向他们提供一些服务 服务器将运行Linux 您能给我推荐一些用户管理 API 我可以用它来开发服务器程序吗 我所说的用户管理是指用户身份验证和其他相关功能 我更喜欢使用
  • 使用Python读取16位PNG图像文件

    我正在尝试读取以 16 位数据类型编写的 PNG 图像文件 数据应转换为 NumPy 数组 但我不知道如何读取 16位 文件 我尝试使用 PIL 和 SciPy 但它们在加载时将 16 位数据转换为 8 位数据 谁能告诉我如何从 16 位
  • 哪一个更好地处理版本控制? XmlSerializer 与 DataContractSerializer?

    需要序列化一个对象 并且反序列化时程序集版本可能发生变化 此外 对象可能会发生一些变化 XmlSerializer 不存储类型信息 如果对象发生一点变化 它也不会失败 但 XmlSerializer 无法序列化超类中的私有或内部属性 我无法
  • JAX-RS 资源生命周期性能影响

    我知道默认情况下 JAX RS 端点生命周期是每个请求一次 以便可以将请求特定信息注入到实例中 而且我们还可以制作一个端点Singleton的意思每个应用程序一次 其中请求特定信息不能注入到实例中 而是可以注入到请求的方法中 1 所以我想知
  • Struts 2:将不同的 XML 验证文件应用于一个操作方法

    我是 Struts 2 Framework 的新手 我使用 XML 验证文件来验证表单的字段 我的问题是 如何将不同的 XML 验证文件应用于一个操作的方法 我还想对不止一种操作方法使用相同的 XML 验证文件 问 如何将不同的 XML 验
  • GetHashCode() 在不同的服务器上给出不同的结果?

    我像这样声明了 C 代码行 int hashcode apple GetHashCode 在我的计算机 工作计算机和朋友的计算机上 结果是 1657858284 在开发服务器上 结果是 1548091822 有没有办法让我告诉项目始终使 G
  • 如何使用 Spring Data JPA + Spring Web MVC 避免 JSON 序列化中的延迟获取?

    我有一个在 Spring Web MVC 中使用 Spring Data JPA 和 REST 控制器的解决方案 持久性提供者是 Hibernate 持久层是使用 Spring 存储库构建的 并且在 REST 控制器和存储库之间存在一个服务
  • 从 Sidekiq 作业中获取错误消息

    我想从 sidekiq 作业中获取异常错误消息 当我将 back trace 选项设置为 true 时 它 会重试我的工作 但我想在出现错误时退出工作并获取错误消息 如果我发现该过程成功或失败就足够了 def perform text be
  • XmlReader ReadStartElement 导致 XmlException

    我正在 Silverlight 项目中使用 XmlReader 编写文件读取器 但是 我遇到了一些错误 特别是在 XmlReader ReadStartElement 方法周围 这让我相信我误解了如何在某个地方使用它 基本上 这是我正在使用
  • 超出地理编码 API 的使用限制

    当访问以下链接时 http maps googleapis com maps api geocode json http maps googleapis com maps api geocode json 我得到回应 error messa
  • 检查对象是否类似于数组

    有没有办法检查一个对象是否是 类似数组 就像这些类型的对象一样 数组 废话 类型化数组 Uint8Array 等 当Array isArray is used 参数对象 节点列表 还有一些我一时想不起来的 我想你可以检查是否存在 lengt