2016-10-04 88 views
0

可以说我有一个表“employeeTbl_1”如何使用underscore.js在多个键的基础上进行排序?

如果我运行下面的查询

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”和“工资”两种,输出如下表进行排序,

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 

你可以在上面看到的(即3个输出)的表进行排序同时在列的基础上,

一样,我需要使用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));     

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

[email protected]:~/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 } ] 
[email protected]:~/myPractise/FunctionalJavascriptPractise$ 

从输出可以看到集合有一个条件,即“工资”来分类的。

如何在JavaScript中使用普通的javaScript或使用underscore.js来实现排序?

我尝试使用普通的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得到分拣

回答

1

下划线的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。你的函数应该返回一个代表该命令的数字:

可选。定义替代排序顺序的函数。该 函数返回一个负数,零或正值,根据 的争论...

+0

sortBy iteratee不接受两个参数 –

+0

你是绝对正确的。我在想念我。然而,js原生数组排序需要一个比较器和2个参数 – Meir

+0

Thx来指出这一点,我编辑了这个问题,它是否回答你的问题? – Meir

相关问题