JS积累学习

一、数组的合并

数组合并不去重可以直接用Array.concat()

1
2
3
4
var a = [1];
var b = [1, 2];
var c = [1, 2, 3];
a.concat(b, c); //[1,1,2,1,2,3]

自定义数组合并去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var a = [1, 2, 3, 4];
var b = [3, 4, 5, 6];
function MergeArray(arr1,arr2){
var _arr = new Array();
for(var i=0;i<arr1.length;i++){
_arr.push(arr1[i]);
}
for(var i=0;i<arr2.length;i++){
var flag = true;
for(var j=0;j<arr1.length;j++){
if(arr2[i]==arr1[j]){
flag=false;
break;
}
}
if(flag){
_arr.push(arr2[i]);
}
}
return _arr;
}

MergeArray(a, b); //[1, 2, 3, 4, 5, 6]

关于数组去重的方法很多,详细的请看javascript 数组合并与去重

二、数组排序

如果是字母,按字母顺序排序

1
2
var a = ["ba", "bb", "bac", "abc"];
a.sort(); //["abc", "ba", "bac", "bb"]

如果是数字,按大小排序

1
2
var a = [2, 1, 0, -1, -8, -2];
a.sort(function(a,b){return a - b}); //[-8, -2, -1, 0, 1, 2]

如果数组里面是对象,我们参考一下这个方法排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var ArraySortBy = function(name){
return function(o, p){
var a, 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;
}
else {
throw ("error");
}
}
}

var a = [{name: 'Amy', age: 10}, {name: 'Jim', age: 8}, {name: 'bob', age: 9}]

a.sort(ArraySortBy('age'));

三、数组的删除

1
2
var a = [1,2,3,4];
a.splice(1,1); //[1,3,4]

第一个参数为开始的位置,第二个参数为从第一个参数位置开始要删除的数目;如果第一个参数为负数,则开始的位置从数组的尾部开始倒数计算。

四、对象的循环

1
2
3
4
5
6
7
var a = {name: 'Amy', age: 18};
for (key in a) {
console.log(key, a[key])
}

// name Amy
// age 18

五、对象的删除

1
2
3
var a = {name: 'Amy', age: 18};
delete a['name'] //true
a //{age: 18}

六、浮点计算问题
js的浮点计算会出现计算错误的问题

1
0.1 + 0.2 //0.30000000000000004

我们需要通过toFixed的方法来解决这个问题。

七、关于Array.find()和Array.indexOf()在safari上不支持,也就意味着iPhone手机不支持。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(searchElement, fromIndex) {

var k;

// 1. Let o be the result of calling ToObject passing
// the this value as the argument.
if (this == null) {
throw new TypeError('"this" is null or not defined');
}

var o = Object(this);

// 2. Let lenValue be the result of calling the Get
// internal method of o with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = o.length >>> 0;

// 4. If len is 0, return -1.
if (len === 0) {
return -1;
}

// 5. If argument fromIndex was passed let n be
// ToInteger(fromIndex); else let n be 0.
var n = +fromIndex || 0;

if (Math.abs(n) === Infinity) {
n = 0;
}

// 6. If n >= len, return -1.
if (n >= len) {
return -1;
}

// 7. If n >= 0, then Let k be n.
// 8. Else, n<0, Let k be len - abs(n).
// If k is less than 0, then let k be 0.
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

// 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the
// HasProperty internal method of o with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
// i. Let elementK be the result of calling the Get
// internal method of o with the argument ToString(k).
// ii. Let same be the result of applying the
// Strict Equality Comparison Algorithm to
// searchElement and elementK.
// iii. If same is true, return k.
if (k in o && o[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
}



if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, "find", {
value: function(predicate) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.find called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;

for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return value;
}
}
return undefined;
}
});
}