簡體   English   中英

如何將 JavaScript ES6 箭頭函數作為參數傳遞

[英]How can I Pass a JavaScript ES6 Arrow Function as a Parameter

我正在嘗試.sort()對象數組,但我的 javascript 知識不夠強大,無法重寫比較器函數以接受箭頭函數來查找對象上的key ,而不是使用字符串。 任何重構這方面的幫助將不勝感激:

我的比較功能:

compareValues = (key, order = "ascending") => {
      let result = 0;

      return function(lhs, rhs) {
        if (!(lhs.hasOwnProperty(key) && rhs.hasOwnProperty(key))) {
          return result; // property is missing; comparison is impossible
        }

        const l = lhs[key].toLowerCase() || lhs[key];
        const r = rhs[key].toLowerCase() || rhs[key];

        result = (l > r) ? 1 : (l < r) ? -1 : 0;

        return result * (order === "ascending") ? 1 : -1;
      };
    };

以傳統方式使用:

objects.sort(compareValues("name")); // or
objects.sort(compareValues("name", descending));

目標是能夠這樣使用它:

objects.sort(compareValues(o => o.name));

...但坦率地說,我直到最近才經常使用 JS,所以我很討厭它。

也許是這樣的:

const compareValues = (pickProp, order = 'ascending') => {
    let result = 0

    return (lhs, rhs) => {
        const l = pickProp(lhs) // pickProp is passed #first-class
        const r = pickProp(rhs)
        if (!l && !r) {
            return 0 // Quick callout here, comparators only ever return -1, 0, or 1.
        }

        result = l > r ? 1 : l < r ? -1 : 0

        // Leveraging your default values here for cleaner signature
        return result * (order === 'ascending') ? 1 : -1
    }
}

list.sort(compareValues(o => o.name))
// or even 
list.sort(compareValues(o => o.name), 'descending')

我相信這與你的問題一致。

我認為你越接近你想要的東西是這樣的:

 let compareValues = (key, order = "ascending") => { let result = 0; return function(lhs, rhs) { if (!(key(lhs) && key(rhs))) { return result; // property is invalid; comparison is impossible } const l = key(lhs).toLowerCase() || key(lhs); const r = key(rhs).toLowerCase() || key(rhs); result = (l > r) ? 1 : (l < r) ? -1 : 0; return result * (order === "ascending") ? 1 : -1; }; }; let objects = [{ "name": "Mary" }, { "name": "John" }]; objects.sort(compareValues(o => o.name)); console.log(objects);

我認為您不需要對對象執行檢查以查看它們是否具有特定屬性,因為您肯定知道。 所以這就是我的看法。


 const comparer= (select, descend = false) => (a, b) => { let lhs = select(a); let rhs = select(b); if (lhs < rhs) return descend ? 1 : -1; if (lhs > rhs) return descend ? -1 : 1; return 0; } let arr = [{ id: 1, name: "Clara" }, { id: 2, name: "Abraham" }, { id: 3, name: "Brian" }] arr.sort(comparer(o => o.name)) console.log(arr); arr.sort(comparer(o => o.name, true)) console.log(arr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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