大前端周刊 第15期 (本期小编:郭俊兵)

Show me the code

  • 对象数组排序

概念:javascript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

语法:arr.sort(by(‘xx’))

  • 参数介绍:

    • function, key
      使用回调函数,处理需要排序的对象key。
  • 返回值
    排序以后的数组。

    针对于偶尔需要前端排序的情况,可以使用该方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 回调函数
function by(name) {
return function(o, p) {
let a;
let b;
if (typeof o === 'object' && typeof p === 'object' && o && p) {
a = o[name];
b = p[name];
if (a === b) {
return 0;
}
if (typeof a === typeof b) {
return a < b ? -1 : 1;
}
return typeof a < typeof b ? -1 : 1;
}
};
}

需要排序的 Array:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const employees = [{
name: 'George',
age: 32,
retiredate: 'March 12, 2014'
}, {
name: 'Edward',
age: 17,
retiredate: 'June 2, 2023'
}, {
name: 'Christine',
age: 58,
retiredate: 'December 20, 2036'
}, {
name: 'Sarah',
age: 62,
retiredate: 'April 30, 2020'
}];

通过 age 排序:

1
employees.sort(by('age'));

结果:

1
2
3
4
[{"name":"Edward","age":17,"retiredate":"June 2, 2023"},
{"name":"George","age":32,"retiredate":"March 12, 2014"},
{"name":"Christine","age":58,"retiredate":"December 20, 2036"},
{"name":"Sarah","age":62,"retiredate":"April 30, 2020"}]

到这里,对象数组排序就算基本实现了。那如何实现多个键值排序呢?意思就是先是对age排序,如果age相同,再比较name。
这时,我们可以进一步修改by函数,让其可以接受第二个参数,当主要的键值产生一个匹配的时候,另一个compare方法将被调用以决出高下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// by函数接受一个成员名字符串和一个可选的次要比较函数做为参数
// 并返回一个可以用来包含该成员的对象数组进行排序的比较函数
// 当o[age]和 p[age] 相等时, 次要比较函数被用来决出高下
function by(name, minor) {
return function(o, p) {
let a;
let b;
if (o && p && typeof o === 'object' && typeof p === 'object') {
a = o[name];
b = p[name];
if (a === b) {
return typeof minor === 'function' ? minor(o, p) : 0;
}
if (typeof a === typeof b) {
return a < b ? -1 : 1;
}
return typeof a < typeof b ? -1 : 1;
} else {
thro("error");
}
}
}

待排序数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const employees = [{
name: 'George',
age: 32,
retiredate: 'March 12, 2014'
}, {
name: 'Edward',
age: 17,
retiredate: 'June 2, 2023'
}, {
name: 'Christine',
age: 32,
retiredate: 'December 20, 2036'
}, {
name: 'Sarah',
age: 62,
retiredate: 'April 30, 2020'
}];
// 排序操作
employees.sort(by('age', by('name')))

结果:

1
2
3
4
[{"name":"Edward","age":17,"retiredate":"June 2, 2023"},
{"name":"George","age":32,"retiredate":"March 12, 2014"},
{"name":"Sarah","age":32,"retiredate":"April 30, 2020"},
{"name":"Christine","age":58,"retiredate":"December 20, 2036"}]

插件推荐

  • jsoneditor JOSN格式编辑器

    安装

    1
    npm install jsoneditor

    引入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import JSONEditor from 'jsoneditor/dist/jsoneditor';
    const container = document.getElementById('jsonEdit');
    container.innerHTML = '';
    const options = {
    mode: 'code',
    };
    const editor = new JSONEditor(container, options);
    // 添加数据
    editor.set(JSON);
    // 获取数据
    editor.get();

文章推荐

招聘

TalkingData DTU 可视化团队招聘:

  • 资深前端工程师
  • 前端实习生

简历投递:

1
2
const email = 'xiang.wang#tendcloud.com'.replace('#', '@');
console.log(email);