我想這樣做:Chainable push()?
arr.push('foo').filter(...)
失敗的原因push()
不返回結果數組。
有沒有辦法做到這一點用純JS或咖啡沒有額外的庫和不宣自定義函數?
我想這樣做:Chainable push()?
arr.push('foo').filter(...)
失敗的原因push()
不返回結果數組。
有沒有辦法做到這一點用純JS或咖啡沒有額外的庫和不宣自定義函數?
如果你不介意不改變數組,你可以使用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(…)
你可以覆蓋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');
即使使用不同的名稱也不要這樣做。你應該在他的回答中重用'[] .push()'就像@justin一樣。 – bits
排序。
您可能超載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());
有沒有辦法做到這一點用純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和鏈接來混帳。
如果這就是你的意思,你不能改變'推'的功能。 – Pointy
_'push()'不會返回結果array_ ... _而不會聲明自定義函數_。你還有什麼想法? – Mathletics
@Mathletics,Bergi提供了兩個有效的選項,見下文。 –