【问题标题】:Typescript - Sort generic array打字稿 - 对通用数组进行排序
【发布时间】:2017-03-19 23:24:40
【问题描述】:

我正在尝试在typescript 中实现一个函数,用户可以在其中传递对象的array 和其中一个对象的属性,并按用户选择的属性返回列表顺序。

function OrderByArray(values: any[], orderType: any) { 
    //TODO: implement code
    return values;
} 

有什么办法吗?我知道如何对数组进行排序,但我不知道如何允许发送 typeof 对象并按其排序。

谢谢!

【问题讨论】:

  • 为什么需要允许类型作为参数?它应该代表排序后的属性?
  • 原因是因为我正在处理一个函数,我必须接收一个数组并且我不知道对象类型,我必须返回由发送的 object.property 排序的值用户。 @马丁
  • 你为什么不只使用property: string
  • 那么,如何按字符串对用户数组[] 进行排序?我的意思是考虑用户可以发送一个人[]、汽车[]...等并要求通过yearnamecarbrand.. 订购。我不知道你能不能得到我。 @马丁
  • 您想按多个属性对数组进行排序?

标签: arrays typescript typescript-typings typescript2.0


【解决方案1】:

您可能不需要将 values.sort(...) 的结果返回为mentioned in MDN

Array.sort 实际上改变或改变了它排序的数组

【讨论】:

    【解决方案2】:

    您可以使用Array.sort 方法:

    function OrderByArray(values: any[], orderType: any) { 
        return values.sort((a, b) => {
            if (a[orderType] < b[orderType]) {
                return -1;
            }
    
            if (a[orderType] > b[orderType]) {
                return 1;
            }
    
            return 0
        });
    }
    

    我不确定item[orderType] 的值是多少,因此您可能需要更改ifs。


    编辑

    使用它:

    let animals = [{ name: "cat" }, { name: "dog" }, { name: "lion" }];
    let cars = [{ manufacturor: "ford" }, { manufacturor: "mazda" }, { manufacturor: "fiat" }];
    
    console.log(OrderByArray(animals, "name").map(item => item.name)); // ["cat", "dog", "lion"]
    console.log(OrderByArray(cars, "manufacturor").map(item => item.manufacturor)); // ["fiat", "ford", "mazda"]
    

    (code in playground)


    第二次编辑

    typescript 2.1 你可以做到:

    function OrderByArray<T, K extends keyof T>(values: T[], orderType: K) {
        ...
    }
    

    More about keyof.

    【讨论】:

    • 它可以工作,让我将它集成到我的代码中,但还不确定。谢谢@nitzan-tomer
    • 在您所做的第一次编辑中可能会出现类似 -> OrderByArray(values, orderType).map(item =&gt; item.orderType) 的情况? @nitzan-tomer
    • 如果orderType 是一个变量,那么你需要这样做:OrderByArray(values, orderType).map(item =&gt; item[orderType])
    • 太棒了!谢谢!我很新使用打字稿。 @nitzan-tomer
    • @chris.currin 已修复。不久前,在功能真正推出之前,也许当时只是keyof T,不确定或记得。
    猜你喜欢
    • 2018-10-09
    • 2022-11-25
    • 2021-07-04
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多