2014-02-18 60 views
1

我想這樣做:Chainable push()?

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

失敗的原因push()不返回結果數組。

有沒有辦法做到這一點用純JS或咖啡沒有額外的庫和不宣自定義函數?

+2

如果這就是你的意思,你不能改變'推'的功能。 – Pointy

+0

_'push()'不會返回結果array_ ... _而不會聲明自定義函數_。你還有什麼想法? – Mathletics

+0

@Mathletics,Bergi提供了兩個有效的選項,見下文。 –

回答

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(…) 
+0

有趣的使用','操作符。但鏈接時看起來並不整齊。 – bits

+0

@bits:那麼,您需要自定義方法 - 但是,可鏈式方法不應修改其參數。 – Bergi

+1

'Coffeescript'沒有實現逗號運算符;但分號幾乎一樣好。 – hpaulj

-2

你可以覆蓋Array對象的推送方法:

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'); 
+1

即使使用不同的名稱也不要這樣做。你應該在他的回答中重用'[] .push()'就像@justin一樣。 – bits

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或東西,但擴展內置類型的原型狀陣列進行破壞其他代碼,特別是如果你使用的是第三方框架的高風險。

雖然有各種方式可以使您的代碼看起來類似。最簡單的方法就是通過使用多個,鏈語句:

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()); 
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和鏈接來混帳。