[英]In Javascript, is there an easyish way to get a chainable Array prepend operation like the reverse of Array.concat?
我正在用 Javascript 進行數組操作,我希望能夠通過多次調用 map、concat 等來鏈接操作。
const someAmazingArrayOperation = (list) =>
list
.map(transformStuff)
.sort(myAwesomeSortAlgorithm)
.concat([someSuffixElement])
.precat([newFirstElement])
.filter(unique)
但我遇到的問題是Array.precat
不存在。 (想想Array.concat
,但反過來。)
出於某種原因,我不想在自己的代碼中修改Array.prototype
。 ( https://flaviocopes.com/javascript-why-not-modify-object-prototype/ )
我完全可以使用Array.concat
並將我的數組連接到前綴數組的末尾並繼續。 但這並沒有與其他東西聯系在一起,它讓我的代碼看起來很笨拙。
這是一個小問題,因為我可以輕松編寫代碼來獲得我想要的輸出。 但這很重要,因為我希望我的代碼看起來很干凈,這似乎是 Array 原型的缺失部分。
有沒有辦法在不修改內置類型原型的情況下獲得我想要的東西?
有關假設的 Array.precat 的更多信息,另請參閱: concat,但 prepend 而不是 append
您可以將Array#reduce
與一個函數一起使用,該函數將initialValue
作為數組用於前置數據。
const precat = (a, b) => [...a, b], result = [1, 2, 3] .reduce(precat, [9, 8, 7]); console.log(result)
出於某種原因,我不想在自己的代碼中修改
Array.prototype
。
這些理由很好,但您可以通過使用碰撞安全屬性來回避它們 - 用符號而不是名稱作為鍵:
const precat = Symbol('precatenate')
Array.prototype[precat] = function(...args) {
return [].concat(...args, this);
};
const someAmazingArrayOperation = (list) =>
list
.map(transformStuff)
.sort(myAwesomeCompareFunction)
.concat([someSuffixElement])
[precat]([newFirstElement])
.filter(unique);
如果不想修改Array.prototype
,可以考慮extends
:
class AmazingArray extends Array { precat(...args) { return new AmazingArray().concat(...args, this); } } const transformStuff = x => 2*x; const myAwesomeSortAlgorithm = (a, b) => a - b; const someSuffixElement = 19; const newFirstElement = -1; const unique = (x, i, arr) => arr.indexOf(x) === i; const someAmazingArrayOperation = (list) => new AmazingArray() .concat(list) .map(transformStuff) .sort(myAwesomeSortAlgorithm) .concat([someSuffixElement]) .precat([newFirstElement]) .filter(unique); console.log(someAmazingArrayOperation([9, 2, 2, 3]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.