Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 规范化数组方法和返回值_Javascript_Arrays_Libraries_Shim - Fatal编程技术网

Javascript 规范化数组方法和返回值

Javascript 规范化数组方法和返回值,javascript,arrays,libraries,shim,Javascript,Arrays,Libraries,Shim,是否有任何JavaScript数组库规范化数组返回值和变异?我认为JavaScript数组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

是否有任何JavaScript数组库规范化数组返回值和变异?我认为JavaScript数组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方法添加垫片,那就太好了。

我认为最好的库之一是下划线js

。是的,它们可能有点混乱,因为JavaScript数组完成了其他语言具有独立结构(列表、队列、堆栈等)的所有工作,但它们的定义在不同语言之间是相当一致的。您可以轻松地将它们按您已经描述的类别进行分组:

  • 列出方法:
    • push
      /
      unshift
      添加元素后返回长度
    • pop
      /
      shift
      返回请求的元素
    • 您可以定义获取第一个和最后一个元素的其他方法,但很少需要它们
  • >代码>拼接/<代码>是在列表中间移除/替换/插入项的万能工具,它返回被删除元素的数组。
  • sort
    reverse
    是两种标准的就地重新排序方法
所有其他方法都不会修改原始数组:

  • slice
    按位置获取子阵列,
    filter
    按条件获取子阵列,
    concat
    与其他子阵列组合创建并返回新阵列
  • forEach
    只迭代数组,不返回任何内容
  • every
    /
    some
    测试项目的条件,
    indexOf
    lastIndexOf
    搜索项目(按相等顺序)-都会返回结果
  • reduce
    /
    reduceRight
    将数组项减少为单个值并返回该值。特殊情况包括:
    • map
      减少为一个新数组-它类似于
      forEach
      但返回结果
    • join
      toString
      简化为字符串
这些方法足以满足我们的大部分需求。我们可以用它们做任何事情,我不知道有任何库向它们添加类似的、但在内部或结果方面不同的方法。大多数数据处理lib(比如)只会使它们跨浏览器安全()并提供额外的实用方法

我想要的是总是对数组进行变异,并且总是返回相同的数组,这样我就可以有某种一致性,并且能够进行链

我认为JavaScript的一致性是在修改元素或长度时始终返回一个新数组。我想这是因为对象是引用值,更改它们太频繁会在引用同一数组的其他作用域中产生副作用

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

A = A.slice(0,1).reverse().concat(['a','b']);
变异方法对我来说只有一个优势:它们更快,因为它们可能更高效地利用内存(当然,这取决于实现及其垃圾收集)。因此,让我们为这些实现一些方法。由于既不可能也不有用,我将在以下页面中定义它们:


您可能不应该仅为此使用库(添加到项目中不是很有用的依赖项)

“标准”方法是在您想要执行变异操作时调用
slice
。这样做没有问题,因为JS引擎非常适合使用临时变量(因为这是javascript的关键点之一)

示例:

function reverseStringify( array ) {
    return array.slice( )
        .reverse( )
        .join( ' ' ); }

console.log( [ 'hello', 'world' ] );

您提供的示例-
A.slice(0,1).reverse().forEach(function(){})-按预期工作。我不确定你对这个例子的观点是什么。您声明希望能够进行链接,然后给出一个使用现有方法进行链接的示例,这是可行的。请提供不适用于现有方法的示例,以便我了解您能够编写的内容。@ŠimeVidas不,因为
slice
不会像我希望的那样改变数组-它返回一个新数组。如果它对
.pop()
.shift()
有帮助,我可以给出更多的例子?它们从数组中删除一个元素,然后返回该元素。你想让它们返回数组吗?@ŠimeVidas是的,这就是问题的关键:在实例中保留变异的数组。如果所有方法都返回原始数组,那么如何提取数组的一部分?
A.shorten(0, 1).reverse().append('a', 'b');
function reverseStringify( array ) {
    return array.slice( )
        .reverse( )
        .join( ' ' ); }

console.log( [ 'hello', 'world' ] );