【问题标题】:How to sort on basis of multiple keys using underscore.js?如何使用 underscore.js 基于多个键进行排序?
【发布时间】:2017-02-12 09:25:54
【问题描述】:

假设我有一个表“employeeTbl_1”

如果我运行以下查询

 select * from employeeTbl_1

输出是

 1  Adam        23000
 2  Adam        22000
 3  Annabel     13500
 4  Abraham     13000
 5  Alan        12000
 6  Svatlana    1500
 7  Svatlana    1400
 8  Shane       12000

现在,如果我使用“employeeName”对上表进行排序

输出如下,

select * from employeeTbl_1 order by employeeName

4   Abraham     13000
1   Adam        23000
2   Adam        22000
5   Alan        12000
3   Annabel     13500
8   Shane       12000
6   Svatlana    1500
7   Svatlana    1400

现在如果我同时使用“employeeName”和“salary”对表格进行排序,输出如下,

select * from employeeTbl_1 order by employeeName, salary

4   Abraham     13000
2   Adam        22000
1   Adam        23000
5   Alan        12000
3   Annabel     13500
8   Shane       12000
7   Svatlana    1400
6   Svatlana    1500

您可以在上面(即第三个输出)中看到表格是根据两个列排序的,

同样我需要使用 underscore.js 库在 javaScript 中实现,

请按照下面的代码,

 var _ = require("underscore");

 var employeeList = [   {"id" : 1, "name" : "Adam", "salary" : 23000 },
                    {"id" : 2, "name" : "Adam", "salary" : 22000 },
                    {"id" : 3, "name" : "Annabel", "salary" : 13500 },
                    {"id" : 4, "name" : "Abraham", "salary" : 13000 },
                    {"id" : 5, "name" : "Alan", "salary" : 12000 },
                    {"id" : 6, "name" : "Svatlana", "salary" : 1500 },
                    {"id" : 7, "name" : "Svatlana", "salary" : 1400 },
                    {"id" : 8, "name" : "Shane", "salary" : 12000 },
                ];

 function sortEmployee(list){
    return _.sortBy(_.sortBy(list,"name"),"salary");
 }

 console.log(sortEmployee(employeeList));                   

如果我运行上面的代码,输出是,

 rahul@rahul:~/myPractise/FunctionalJavascriptPractise$ node practise22.js 
 [ { id: 7, name: 'Svatlana', salary: 1400 },
   { id: 6, name: 'Svatlana', salary: 1500 },
   { id: 5, name: 'Alan', salary: 12000 },
   { id: 8, name: 'Shane', salary: 12000 },
   { id: 4, name: 'Abraham', salary: 13000 },
   { id: 3, name: 'Annabel', salary: 13500 },
   { id: 2, name: 'Adam', salary: 22000 },
   { id: 1, name: 'Adam', salary: 23000 } ]
 rahul@rahul:~/myPractise/FunctionalJavascriptPractise$

从输出中您可以看到集合是按一个条件排序的,即“薪水”。

我怎样才能在 JavaScript 中使用普通的 javaScript 或使用 underscore.js 来实现排序,就像我在 sql 中得到的那样。

我尝试使用普通的 javaScript 和 underScore.js

function sortEmployee(list){
   return list.sort(function(employee1,employee2){      
    return _.isEqual(employee1.name,employee2.name) ?
            (_.isEqual(employee1.name,employee2.name) && (employee1.salary < employee2.salary)) : _.isEqual(employee1.name,employee2.name);
    });
}

console.log(sortEmployee(employeeList));

输出是

[ { id: 1, name: 'Adam', salary: 23000 },
  { id: 2, name: 'Adam', salary: 22000 },
  { id: 3, name: 'Annabel', salary: 13500 },
  { id: 4, name: 'Abraham', salary: 13000 },
  { id: 5, name: 'Alan', salary: 12000 },
  { id: 6, name: 'Svatlana', salary: 1500 },
  { id: 7, name: 'Svatlana', salary: 1400 },
  { id: 8, name: 'Shane', salary: 12000 } ]

我仍然没有得到想要的输出,这是我在 sql 排序中得到的

【问题讨论】:

    标签: javascript sorting underscore.js


    【解决方案1】:

    Underscore 的 sortBy 也接受一个 iteratee 函数,如果你传递给它一个首先检查姓名的函数,如果它们相等则比较薪水,你会得到所需的排序。

    comparator(v1, v2){
       return ((v1.name  - v2.name) || (v1.value - v2.value))
    }
    

    如果名称相同,则第二个子句启动并比较值。

    阅读您的评论后,这是一个更新版本:

    function nameSalaryComparator(v1, v2){
      return (v1.name === v2.name ?
              v1.salary - v2.salary :
              (v1.name > v2.name ? 1 : -1));
    }
    

    您可以找到工作的jsbin here。我什至添加了另一个条目以显示它的正确排序。

    您的代码可能不起作用,因为您返回的是布尔值而不是数字。我无法访问 MDN 的站点,但您可以看到参考 here。您的函数应该返回一个代表订单的数字:

    可选。定义替代排序顺序的函数。这 函数应返回负值、零或正值,具体取决于 关于论点...

    【讨论】:

    • sortBy iteratee 不接受两个参数
    • 你是绝对正确的。我在想lodash。然而,js 原生数组排序需要一个带有 2 个参数的比较器
    • 感谢您指出这一点,我编辑了问题,它回答了您的问题吗?
    • 谢谢,真的很有帮助
    • 实际上我正在阅读一本书,“使用 Underscore.js 在 JavaScript 中进行函数式编程”,因此使用了这个库。看书练例子很无聊,有没有好的javaScript函数式编程代码库。
    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2022-07-22
    • 2010-09-26
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多