JS学习day08--数组对象

数组

数组:使用单独的变量名来存储一系列的值。数组是可以存储任意数据类型的数据。

1、数组创建

字面量

// 1、字面量创建(建议使用)
var arr = []; // 创建一个空数组
var arr = [1, 2, 3]; // 创建有三个值的数组
var arr = [3];
var arr = [1, 'ab', true, null, undefined, [], {}, function () { }, new Date()]; // 数组中可以放任何类型的数据
console.log(arr);

构造函数

// 2、构造函数创建
var arr = new Array();
var arr = new Array(1, 2, 3);
var arr = new Array(3); // 3作为数组的长度 [undefined, undefined, undefined]
var arr = new Array('3'); // ['3']
console.log(arr);
2、数组的读写

读:数组[下标]

var arr = ['刘备', '关羽', '张飞'];

// 读:数组[下标]
console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr[5]); // 读一个不存在的下标,返回undefined

// 数组循环(遍历)
for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

写:数组[下标] = 值

var arr = ['刘备', '关羽', '张飞'];

// 写:数组[下标] = 值
arr[0] = '洋洋';
arr[5] = '小王'; // 给一个不存在的下标赋值,数组长度会增加,以适应你给的这个值
console.log(arr); // [ "洋洋", "关羽", "张飞", undefined, undefined, "小王" ]
console.log(arr.length); // 6
3、length属性
// 数组长度可读可写
var arr = ['刘备', '关羽', '张飞'];

console.log(arr.length); // 3

arr.length = 1;
console.log(arr); // ['刘备']

arr.length = 5;
console.log(arr); // [ "刘备", "关羽", "张飞", undefined, undefined ]
4、四个小宝贝

push unshift pop shift

var arr = ['刘备', '关羽', '张飞'];

// 共同点:都会改变原数组
// 添加的方法:返回的都是新数组的长度,一次可以添加多个
// 删除的方法:返回被删除的项,一次只能删除一个

// 数组.push(值);  向数组的尾部添加,一次可以添加多个,返回修改后数组的长度
var n = arr.push('洋洋');
console.log(arr);
console.log(n);

// 数组.unshift(值);  向数组的头部添加,一次可以添加多个,返回修改后数组的长度
var n = arr.unshift('洋洋', '房星');
console.log(arr);
console.log(n);

// 数组.pop(); 删除数组的最后一项,一次只能删除一项,返回被删除的项
var n = arr.pop();
console.log(arr);
console.log(n);

// 数组.shift(); 删除数组的第一项,一次只能删除一项,返回被删除的项
var n = arr.shift();
console.log(arr);
console.log(n);
5、最强大的splice
  • 数组.splice(起始下标, 要删除的个数, 要添加的项);

可以实现对数组任意位置的添加、删除、替换。返回被删除的项组成的数组

var arr = ['刘备', '关羽', '张飞'];

// 删除
var n = arr.splice(1, 2);
console.log(arr);
console.log(n);

// 替换
var n = arr.splice(1, 1, '关平', '关兴', '洋洋');
console.log(arr);
console.log(n);

// 添加
var n = arr.splice(2, 0, '关平', '关兴', '洋洋');
console.log(arr);
console.log(n);
6、sort排序

数组.sort();

  • 会修改原数组,返回修改后的数组
  • 默认以字符串进行排序(即便你给的是数字,也是以字符串排序)
  • 可以给sort传一个比较函数,进行自定义排序
var arr = [4, 6, 3, 12, 2];

arr.sort(); // 默认排序
console.log(arr); // [ 12, 2, 3, 4, 6 ]

// ----------------------
// 传入比较函数
arr.sort(function (a, b) {
    // return a - b; // 从小到大
    return b - a; // 从大到小
});
console.log(arr);

案例:

1、根据对象的key进行排序

2、根据中文进行排序

7、排序算法

1、选择排序

  • 从第一项起,每一项都和后面所有项依次比较,如果被比较项比当前项小,则两项交换位置。
  • 每一轮,都找到一个最小的数,放到前面。
var arr = [5, 32, 2, 7, 45];
console.log(fn(arr));

function fn(arr) {
    for (var i = 0; i < arr.length - 1; i++) {
        for (var j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                var temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }
        }
        // console.log(arr);
    }
    return arr;
}

2、冒泡排序

从第一项起,比较相邻的两个元素,如果前一个比后一个大,则交换位置。第一轮的时候最后一个元素应该是最大的一个。每一轮最后一个元素已经是最大的了,所以最后一个元素下一轮不用比较。

var arr = [5, 32, 2, 7, 45];
console.log(fn(arr));

function fn(arr) {
    for (var i = 1; i < arr.length; i++) {
        for (var j = 0; j < arr.length - i; j++) {
            if (arr[j] > arr[j + 1]) {
                var temp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

3、快速排序

  • 取得数组的第一项,其它项依次同第一项进行比较,如果比它小,放到左边数组,如果比它大,放到右边数组,依次递归调用
  • 递归调用要判断一个结束的条件,即数组长度小于等于1,则返回
var arr = [4, 6, 2, 6, 5, 8, 4, 7, 3];
console.log(fn(arr));

function fn(arr) {
    if (arr.length <= 1) {
        return arr;
    }

    var left = []; // 存小于它的值
    var right = []; // 存大于它的值
    var num = arr.shift(); // 删除数组的第一项,并取得这项

    for (var i = 0; i < arr.length; i++) {
        var v = arr[i];
        if (v > num) {
            right.push(v);
        } else {
            left.push(v);
        }
    }

    return fn(left).concat(num, fn(right));
}
8、数组的其它方法
1、concat 拼接

数组.concat(参数); 参数可以是数组,也可以是其它项,返回的结果为拼接后的数组

var arr1 = [1, 2, 3];
var arr2 = ['a', 'b', 'c'];

// var arr = arr1.concat(arr2);
console.log(arr1); // 不影响原数组
console.log(arr2);
console.log(arr); // [ 1, 2, 3, "a", "b", "c" ]

// 推荐
var arr = [].concat(arr1, arr2, true, '洋洋');
console.log(arr);
2、reverse 反转

数组.reverse();

var arr = [1, 2, 3];
arr.reverse();
console.log(arr); // [ 3, 2, 1 ]

// -------------
// 字符串没有反转的方法,转成数组
var str = '你爱我'; // 我爱你
var v = str.split('').reverse().join('');
console.log(v);
3、slice 截取

数组.slice(起始下标, 结束下标);

var arr = ['a', 'b', 'c', 'd', 'e'];

console.log(arr.slice()); // 没有参数,返回全部 [ "a", "b", "c", "d", "e" ]
console.log(arr.slice(2)); // 有1个参数,从第一个参数处起,到最后 [ "c", "d", "e" ]
console.log(arr.slice(2, 4)); // 有两个参数,从第一个参数起,到第二个参数止,不包括第二个参数 [ "c", "d" ]
console.log(arr.slice(4, 2)); // 第一个参数比第二个参数大,返回空数组 []
console.log(arr.slice(2, -1)); // 负数同长度相加 [ "c", "d" ]

4、indexOf和lastIndexOf
  • IE8及以下不支持
  • 数组.indexOf(要查找的项, [起始位置]); 返回找到的下标,找不到返回-1
  • 数组.lastIndexOf(要查找的项, [起始位置]); 从右向左查找
var arr = [32, 4, 32, 4, 2, 4, 3, 2];

console.log(arr.indexOf(4)); // 1
console.log(arr.indexOf(4, 2)); // 3
console.log(arr.indexOf(4, 4)); // 5
console.log(arr.indexOf('4')); // -1

console.log(arr.lastIndexOf(4)); // 5

案例:数组去重

5、Array.isArray 数组类型判断

Array.isArray(参数)

判断参数是否是数组,如果是,返回true,否则返回false,IE8及以下不支持

console.log(typeof []); // object
console.log(typeof null); // object
console.log(typeof {}); // object

console.log(Array.isArray([])); // true
console.log(Array.isArray(null)); // false
console.log(Array.isArray({})); // false
9、数组的迭代方法
  • 参数为一个函数,这个函数有三个参数,分别为:数组项 下标 数组本身
  • IE8及以下不支持
1、forEach
// 数组.forEach(function (item, index, array) { });
// 作用:循环数组,没有返回值,仅仅替代for循环
var arr = ['刘备', '关羽', '张飞'];
arr.forEach(function (item, index, array) {
    console.log(item, index, array);
});
2、map
// 数组.map(function (item, index, array) { });
// 作用:循环数组,返回由函数调用的结果组成的新数组
var arr = [2, 3, 4];
var n = arr.map(function (item, index) {
    // console.log(item, index);
    return item * 2;
});
console.log(n); // [ 4, 6, 8 ]
3、filter
// 数组.filter(function (item, index, array) { });
// 作用:循环数组,如果函数调用的结果为true,则当前对应的项放到新数组中
var arr = [2, 3, 4, 10, 20];
var n = arr.filter(function (item, index, array) {
    return item > 3 && item < 15;
});
console.log(n);
4、every
// 数组.every(function (item, index, array) { });
// 作用:循环数组,如果每一项函数调用的结果为true,则返回true
var arr = [2, 3, 4, 10, 20];
var n = arr.every(function (item) {
    return item > 1;
});
console.log(n);
5、some
// 数组.some(function (item, index, array) { });
// 作用:循环数组,只要有一项的返回值为真,则结果为真
var arr = [2, 3, 4, 10, 20];
var n = arr.some(function (item, index) {
    return item > 20;
});
console.log(n);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值