Javascript 规范化数组方法和返回值
是否有任何JavaScript数组库规范化数组返回值和变异?我认为JavaScript数组API非常不一致 有些方法会改变数组: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
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
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' ] );