【发布时间】:2012-10-19 15:45:17
【问题描述】:
是否有任何 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']);
我尝试了一些简单的 sn-ps,例如:
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 方法添加填充程序,那就太好了。
【问题讨论】:
-
您提供的示例 -
A.slice(0,1).reverse().forEach(function(){});- 按预期工作。我不确定你对这个例子的意义是什么。您声明您希望能够进行链接,然后您举了一个使用现有方法进行链接的示例,这是可行的。请提供不与现有方法一起使用的示例,以便我了解您将能够写什么。 -
@ŠimeVidas 不,它没有,因为
slice不会像我想要的那样改变数组 - 它返回一个新数组。如果有帮助,我可以举更多例子 -
.pop()和.shift()怎么样?他们从数组中删除一个元素,并返回该元素。你想让他们返回数组吗? -
@ŠimeVidas 是的,这就是重点:将变异的数组保留在实例中。
-
如果所有方法都返回原始数组,您将如何提取数组的一部分?
标签: javascript arrays libraries shim