可连锁推()?

时间:2014-02-18 20:56:44

标签: javascript coffeescript

我想这样做:

arr.push('foo').filter( ... )

此操作失败,因为push()未返回结果数组。

有没有办法用纯JS或咖啡来做这个,没有额外的库,也没有声明自定义函数?

4 个答案:

答案 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');