簡體   English   中英

在 Javascript 中,是否有一種簡單的方法來獲得可鏈接的 Array 前置操作,如 Array.concat 的反向操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM