我想这样做:
arr.push('foo').filter( ... )
此操作失败,因为push()
未返回结果数组。
有没有办法用纯JS或咖啡来做这个,没有额外的库,也没有声明自定义函数?
答案 0 :(得分:3)
如果您不介意不改变数组,可以改为使用concat
:
arr.concat('foo').filter(…)
// if you don't know whether your item is not an array, use ['foo'] instead
否则,如果没有自定义功能,您可以使用comma operator:
(arr.push('foo'), arr).filter(…)
答案 1 :(得分:1)
排序。
你可以过载Array.prototype.push
,如下所示:
Array.prototype.push = (function(oldPush) {
return function() {
var args = [].slice.apply(arguments);
oldPush.apply(this, args);
return this;
};
})([].push);
这将与Array.prototype.push
做同样的事情,甚至保留原始方法,但会返回数组。
但是,在执行此操作之前请先考虑。 Array.prototype.push
是一个非常常见的功能,您的代码库中的其他内容很可能会使用它。您可以将新函数命名为其他内容,例如chainPush
或其他内容,但扩展内置类型(如Array)的原型会导致破坏其他代码的风险很高,尤其是在您使用第三方框架时。
但是,有各种方法可以使您的代码看起来类似。最简单的方法是使用多个链式语句:
arr.push('foo'), arr.filter( ... )
你甚至可以创建某种包装器:
function arrayBuilder(arr) {
var Wrapped = function() {
this.push = function() {
var args = [].slice.apply(arguments);
[].push.apply(arr, args);
return this;
};
this.toArray = function() { return arr; };
};
return new Wrapped();
}
//usage:
var x = arrayBuilder([1,2,3]);
console.log(x.push(4).push(5).toArray());
答案 2 :(得分:0)
有没有办法用纯JS或咖啡来做这个,没有额外的库,也没有声明自定义函数?
我重新考虑“没有额外的图书馆”部分。已经编写的经过测试且可靠的代码比您自己编写的代码更可取。考虑到这一点,我认为最安全的方法是使用lodash。要链接推送使用链接功能:
> arr = [12,23,34]
[12, 23, 34]
> ch = _(arr).push(48).push(56,72,78).push(92)
lodashWrapper {__chain__: ...
> ch.push(108)
lodashWrapper {__chain__: ...
> ch.value()
[12, 23, 34, 48, 56, 72, 78, 92, 48, 56, 72, 78, 92, 108]
如果您在其页面上打开控制台,则可以通过_
变量访问lodash。可能是快速查看库的最简单方法。如果你需要推送一个数组,你应该能够使用foreach以及链接到git er dun。
答案 3 :(得分:-2)
您可以覆盖Array对象的push方法:
Array.prototype.push = function (str) {
this[this.length] = str;
return this;
}
或者为Array原型创建一个新方法:
Array.prototype.pushAndReturn = function (str) {
this[this.length] = str;
return this;
}
var array = [];
array.pushAndReturn('hello').pushAndReturn('world');