规范化数组方法和返回值

2024-03-19

是否有任何 JavaScript 数组库可以规范化数组返回值和突变?我认为 JavaScript Array API 非常不一致。

有些方法会改变数组:

var A = [0,1,2];
A.splice(0,1); // reduces A and returns a new array containing the deleted elements

有些则不然:

A.slice(0,1); // leaves A untouched and returns a new array

有些返回对变异数组的引用:

A = A.reverse().reverse(); // reverses and then reverses back

有些只是返回未定义:

B = A.forEach(function(){});

我想要的是始终改变数组并始终返回相同的数组,这样我就可以具有某种一致性并且也能够链接。例如:

A.slice(0,1).reverse().forEach(function(){}).concat(['a','b']);

我尝试了一些简单的片段,例如:

var superArray = function() {
    this.length = 0;
}

superArray.prototype = {
    constructor: superArray,

    // custom mass-push method
    add: function(arr) {
        return this.push.apply(this, arr);
    }
}

// native mutations
'join pop push reverse shift sort splice unshift map forEach'.split(' ').forEach(function(name) {
    superArray.prototype[name] = (function(name) {
        return function() {
            Array.prototype[name].apply(this, arguments);
            // always return this for chaining
            return this;
        };
    }(name));
});

// try it
var a = new superArray();
a.push(3).push(4).reverse();

这对于大多数变异方法来说效果很好,但也存在问题。例如,我需要为每个不会改变原始数组的方法编写自定义原型。

因此,当我这样做的时候,我总是在想,也许这件事以前已经做过了?是否有任何轻量级数组库可以做到这一点?如果该库还为旧浏览器的新 JavaScript 1.6 方法添加填充程序,那就太好了。


我不认为这真的很矛盾。是的,它们可能有点令人困惑,因为 JavaScript 数组可以完成其他语言具有单独结构(列表、队列、堆栈等)的所有操作,但它们的定义在不同语言中非常一致。您可以轻松地将它们分组到您已经描述过的类别中:

  • list methods:
    • push/unshift返回添加元素后的长度
    • pop/shift返回请求的元素
    • 您可以定义其他方法来获取第一个和最后一个元素,但很少需要它们
  • splice是用于在列表中间删除/替换/插入项目的通用工具 - 它返回已删除元素的数组。
  • sort and reverse是两种标准的就地重新排序方法。

所有其他方法都不会修改原始数组:

  • slice按位置获取子数组,filter通过条件和concat与其他数组结合创建并返回新数组
  • forEach只是迭代数组并且不返回任何内容
  • every/some test the items for a condition, indexOf and lastIndexOf搜索项目(通过相等) - 两者都返回结果
  • reduce/reduceRight reduce the array items to a single value and return that. Special cases are:
    • map减少到一个新的数组 - 就像forEach但返回结果
    • join and toString减少为字符串

这些方法足以满足我们的大部分需求。我们可以用它们做几乎所有的事情,而且我不知道有任何库向它们添加类似的但内部或结果方面不同的方法。大多数数据处理库(例如下划线 http://underscorejs.org/)只使它们跨浏览器安全(es5-shim https://github.com/kriskowal/es5-shim)并提供额外的实用方法。

我想要的是始终改变数组并始终返回相同的数组,这样我就可以具有某种一致性并且也能够链接。

我想说 JavaScript 的一致性是当元素或长度被修​​改时总是返回一个新的数组。我猜这是因为对象是引用值,更改它们常常会在引用同一数组的其他作用域中产生副作用。

链接仍然是可能的,你可以使用slice, concat, sort, reverse, filter and map只需一步即可一起创建一个新数组。如果您只想“修改”数组,只需将其重新分配给数组变量即可:

A = A.slice(0,1).reverse().concat(['a','b']);

突变方法对我来说只有一个优点:它们更快,因为它们可能更节省内存(当然取决于实现及其垃圾收集)。那么让我们为这些实现一些方法。作为数组子类化 http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array既不可能也没有用,我将在原生原型 http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/:

var ap = Array.prototype;
// the simple ones:
ap.each = function(){ ap.forEach.apply(this, arguments); return this; };
ap.prepend = function() { ap.unshift.apply(this, arguments); return this; };
ap.append = function() { ap.push.apply(this, arguments; return this; };
ap.reversed = function() { return ap.reverse.call(ap.slice.call(this)); };
ap.sorted = function() { return ap.sort.apply(ap.slice.call(this), arguments); };
// more complex:
ap.shorten = function(start, end) { // in-place slice
    if (Object(this) !== this) throw new TypeError();
    var len = this.length >>> 0;
    start = start >>> 0; // actually should do isFinite, then floor towards 0
    end = typeof end === 'undefined' ? len : end >>> 0; // again
    start = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);
    end = end < 0 ? Math.max(len + end, 0) : Math.min(end, len);
    ap.splice.call(this, end, len);
    ap.splice.call(this, 0, start);
    return this;
};
ap.restrict = function(fun) { // in-place filter
    // while applying fun the array stays unmodified
    var res = ap.filter.apply(this, arguments);
    res.unshift(0, this.length >>> 0);
    ap.splice.apply(this, res);
    return this;
};
ap.transform = function(fun) { // in-place map
    if (Object(this) !== this || typeof fun !== 'function') throw new TypeError();
    var len = this.length >>> 0,
        thisArg = arguments[1];
    for (var i=0; i<len; i++)
        if (i in this)
            this[i] = fun.call(thisArg, this[i], i, this)
    return this;
};
// possibly more

现在你可以做

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

规范化数组方法和返回值 的相关文章

  • Cypress:在 JSON 响应中存根特定键

    我想在 Cypress 中存根以下响应 专门存根密钥ds version 可能的值为 0 1 或 2 每个值将在 UI 上显示不同的元素 fixtures user json email email protected cdn cgi l
  • 如何从 JavaScript 触发 ASP.NET Core 客户端验证

    有没有办法从 JavaScript 触发 ASP NET Core 客户端验证 我有一个 Razor Pages 页面 其中包含
  • List.Clear() 在 C# 中是如何实现的?

    我假设它使用数组来实现 List 怎么List Clear 实施的 它实际上清理了数组还是只是为此列表创建了一个新数组 public class List private Array array public void Clear1 arr
  • javascript - 动态变量

    您好 我正在尝试创建动态变量 但它说 变量 v0 到 v5 未定义 td each function i eval var v i this html 任何帮助将不胜感激 这听起来是个坏主意 你有什么理由不能这样做吗 var tdHtml
  • 定时器内嵌套异步等待 - 不返回所需的值

    我必须使用 Mocha 和 chai 测试来测试端点的响应 下面是相同的代码 async function getData userId let response let interval setInterval async gt resp
  • 使用 Jquery 更改 css 属性时的事件检测

    有没有办法检测元素的 显示 css 属性是否更改 是否更改为无 块或内联块 如果没有的话有什么插件吗 谢谢 Note 突变事件 https developer mozilla org en US docs Web Guide Events
  • WaveSurfer JS 无法在 Firefox 中为特定的 mp3 音频文件生成图表

    我们面临着在 Firefox 中使用 wavesurfer JS 对某些特定格式的 mp3 文件绘制音频可视化 图表 的问题 它总是给我们这样的错误 传递给decodeAudioData 的缓冲区包含未知的内容类型 但同一个文件在 chro
  • 有没有等效的 gulp 插件来执行“grunt Bower”?

    With grunt 我可以使用命令grunt bower 由 提供grunt bower requirejs https github com ck86 gulp bower files 自动生成RequireJS我本地的配置文件bowe
  • 检测 iPad Safari 用户的最佳方法

    添加用于检测 iPad Safari 用户的代码的最佳方法是什么 我的意思是我们应该使用 1 CSS 通过链接媒体 2 JS 通过navigator对象 我听说使用用户代理字符串并不是检测 iPad 的最佳方法 因为存在不一致的情况 请建议
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • 什么是闭包编译器?

    如果您不知道我在说什么 请查看以下内容 http closure compiler appspot com home http closure compiler appspot com home 这是一个 JavaScript 压缩器 在他
  • JavaScript:嵌套循环?

    我想实现这样的动画 序列 动画以循环开始 想象一下car从 x1 移动到 x2 然后暂停 1 秒 然后再次播放动画 想象一下car从 x2 移动到 x3 等 the car循环是通过向汽车左侧添加 1px 来实现的 值 但我无法弄清楚嵌套循
  • 从 postgres 表中提取 json 数组给出错误:无法从标量中提取元素

    通过使用jsonb array elements 提取出来的函数jsonb来自 Postgres 的数据数组 它给出了错误 无法从标量中提取元素 我认为这是因为NULL在返回调用中 添加了NULL检查状况但不工作 任何帮助表示赞赏 sele
  • 如何在一列中存储数组或多个值

    运行 Postgres 7 4 是的 我们正在升级 我需要将 1 到 100 个选定项目存储到数据库的一个字段中 98 的情况下 只会输入 1 个项目 而 2 的情况下 如果是这样的话 会输入多个项目 这些项目只不过是文本描述 截至目前 长
  • FB.getLoginStatus() 不起作用

    我正在尝试编写一段代码来检查用户是否登录 发现FBJS API中有一个内置方法 叫做getLoginStatus 我已经在html中实现了它 但出于某种原因 getLoginStatus 内部的alert 不会被触发 我也尝试在 init
  • 如何缩放到高图中的特定点

    Highmaps highcharts 是一个 javascript jquery 适配器 可在浏览器等中呈现地图 我有一张突出显示单个国家 地区的地图 但是 世界 地图的比例如此之大 因此我想在将地图加载到相关国家 地区后进行放大 看看
  • 为什么 [].push([]) 返回 1? [复制]

    这个问题在这里已经有答案了 为什么这会返回 1 push outputs 1 push 返回数组的新长度 one push two returns 2 array length is 2 one two push something ret
  • 有没有用 Javascript 编写的开源 JSDoc 解析器?

    我正在寻找一个可以在我的项目中使用的 JSDoc 解析器 我正在寻找可以传递 JSDoc 注释并接收该注释含义的结构化描述的东西 我见过的大多数工具似乎都能够将 JSDoc 注释转换为 HTML 或其他格式 我正在寻找能够提供可用于输入其他
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si

随机推荐

  • 使用 google API、jQuery 从地理编码中提取 + 4 邮政编码

    我正在 jQuery 的帮助下使用谷歌 API 进行地理编码 以下是我尝试过的代码 jQuery document ready function var geocoder new google maps Geocoder jQuery Ad
  • 在“功能”选项卡上添加背景模式

    我使用的是 Xcode 6 3 我刚刚在功能选项卡上添加了蓝牙背景模式 需要执行一个步骤 即 将 所需的背景模式 键添加到您的 info plist 文件中 然而苹果文档 https developer apple com library
  • BeautifulSoup soup.prettify() 给出奇怪的输出

    我正在尝试解析一个网站 稍后我将在我的 Django 项目中使用它 为此 我使用 urllib2 和 BeautifulSoup4 然而 我却没能得到我想要的 BeautifulSoup 对象的输出很奇怪 我尝试了不同的页面 它有效 输出正
  • 在 Scala 2.10 中获取 java.lang.Class[T] 的 Scala 类型

    我在看scala 反射概述 http docs scala lang org overviews reflection overview html我想知道是否可以使用java lang Class
  • Python numpy 减法没有负数(4-6 给出 254)

    我想减去2gray人脸彼此之间可以看到差异 但我遇到了一个问题 例如减去 4 6 给出 254 而不是 2 或差值 2 print type face
  • 检查 JQuery 中的单选按钮

    我需要以编程方式检查单选按钮的值 该表格有一个id并且输入类型显然有一个名称 但没有 id 到目前为止 我成功运行的唯一代码是 input name my name eq 1 attr checked checked 但我希望能够通过明确提
  • 多个resque工作模式创建额外的进程

    我需要启动 4 个 resque 工作人员 所以我使用了以下命令 bundle exec rake environment resque workers RAILS ENV production COUNT 4 QUEUE VERBOSE
  • Python 中的调用是如何工作的? [复制]

    这个问题在这里已经有答案了 对于我正在开发的一个项目 我正在实现一个链表数据结构 它基于对的概念 我将其定义为 class Pair def init self name prefs score self name name self sc
  • d3.js 中的地理图表

    我正在寻找一些指导或示例如何在 d3 js 中制作地理图表 我需要类似的东西this one https developers google com chart interactive docs gallery geochart在谷歌图表中
  • ESB 应该如何打包/部署?

    我正在尝试了解 Apache Camel 它似乎是一个轻量级的 ESB 如果我正确理解 Camel ESB 那么您可以将 Camel Route 视为节点和边的图 每个节点都是路由上的端点 可以消耗 产生消息 每条边都是两个不同端点 1 个
  • 为什么模态/非模态对话框称为模态/非模态?

    我总是很难记住模态对话框还是非模态对话框是否会阻止应用程序其他部分的操作 有谁知道为什么这样称呼他们 使用模式对话框 您可以将应用程序设置为特定的mode 如果您愿意 可以选择不同的 状态 仅接受与该 模式 相关的操作 从而防止对话框之外的
  • 读取文件时 Bash 用户提示

    我试图在 Bash 中逐行读取文件时创建用户提示 我的想法是使用 Gnuplot 逐一绘制各种文件 这是我所拥有的 bin bash echo Enter filename that contains the filenames read
  • 轻量级正则表达式解析器

    我想使用正则表达式解析器来帮助 C 应用程序中的一些字符串处理 我理想地寻找轻量级和开源的东西 目标平台是嵌入式系统 因此我们希望尽可能节省内存消耗 我在网上找到了许多选项 但想知道是否有人可以提出可能在这种特定情况下有所帮助的其他建议 非
  • Android 通过电报发送消息?

    我已经安装了 telegram 应用程序 只想通过 telegram 从我的应用程序向联系人发送消息 字符串 我所发现的只是这个问题 如何通过电报发送 Intent https stackoverflow com questions 216
  • 使用 SaxParser 解析 XML 文档时出现问题 - 2047 个字符限制?

    我创建了一个扩展 SaxParser DefaultHandler 类的类 我的目的是将 XML 输入存储在一系列对象中 同时保留原始 XML 数据的数据完整性 在测试过程中 我注意到一些节点数据在输入时被任意截断 例如 Input
  • 使用 OpenCV 将光栅图像转换为矢量图形?

    我正在寻找使用 OpenCV 将光栅图像转换为矢量数据的可能性 在那里我发现了一个函数cv findContours 这似乎有点原始 更可能是我没有完全理解它 它似乎仅使用黑白图像 没有灰度和彩色图像 并且似乎不接受任何可能有助于噪声图像的
  • 简单存储过程问题

    我正在 VS 2010 SQL Server 2008 中创建一个简单的存储过程 如下所示 CREATE PROCEDURE ReturnPrice carID int price decimal 18 2 output AS SELECT
  • Haskell 平面图

    我是一个对 Haskell 感兴趣的初学者 我一直在尝试自己实现 flatmap gt gt 以更好地理解它 目前我有 flatmap t gt a gt t gt a flatmap flatmap f x xs f x flatmap
  • 如何强制右对齐 UITextView 中的尾随空格?

    我有一个 UITextView 可以左对齐 右对齐或居中 我注意到 如果我右对齐 textView 则 textView 中任何文本行中的任何尾随空格都会被忽略 左对齐时 前导空格不会发生这种情况 从视觉上看 这就是发生的情况 用 来可视化
  • 规范化数组方法和返回值

    是否有任何 JavaScript 数组库可以规范化数组返回值和突变 我认为 JavaScript Array API 非常不一致 有些方法会改变数组 var A 0 1 2 A splice 0 1 reduces A and return