Js数组常见用法及面试题

0.改变原数组的7个方法

push pop shift unshift
reverse
splice
sort

splice() 方法用于添加或删除数组中的元素。

一.判断是否为数组

1.1 instanceof操作符

这个操作符是检测对象的原型链是否指向构造函数的prototype对象的。

var arr = [1,2,3];
console.log(arr instanceof Array)
1.2 ES6方法 Array.isArray
var arr = [12,32,3];
console.log(Array.isArray(arr));

二.数组的去重

2.1 使用ES6的Set高阶函数
var arr = [1, 2, 3, 4, 3, 7, 7];

function quchong(array) {
     return Array.from(new Set(array))
 }
 console.log(quchong(arr))
2.2 使用数组自带的fiter()
var arr = [1, 2, 3, 4, 3, 7, 7];

var arr1 = arr.filter((ele,i,self) => {
    return self.indexOf(ele)  === i;
})
 console.log(arr1);
2.3 使用indexof()
var arr = [1, 2, 3, 4, 3, 7, 7];
var arr2 = [];  // 1.定义一个新的数组 
for (var i = 0; i < arr.length; i++) {  // 2.遍历老的数组
     if (arr2.indexOf(arr[i]) < 0) {   // 3.判断新数组里没有就加进去
         arr2.push(arr[i]);
     }
 }
 console.log(arr2);

三.数组的扁平化

3.1 Array.flat(Infinity)

当传入Infinity时,相当于扁平化最深层次的数组,不传递参数的时候默认为一层

var res = [1,2,[3,[4,[5]]]]
var arr = res.flat(Infinit);
console.log(arr)

if(Array.prototype.flat){
    arr = res.flat();
}else{
    arr = res.reduce((acc, val) => {
        return acc.concat(val)
    },[])
}
3.2 reduce + 递归 也可以实现

遍历数组每一项,若值为数组则递归遍历,否则concat。

var res = [1,2,[3,[4,[5]]]]
function flatten(arr) {  
    return arr.reduce((result, item)=> {
        return result.concat(Array.isArray(item) ? flatten(item) : item);
    }, []);
}
console.log(flatten(res))
3.3 es6的扩展运算符 + while
// es6的扩展运算符能将二维数组变为一维
var newArr  = [].concat(...[1, 2, 3, [4, 5]]);  // [1, 2, 3, 4, 5]
// 根据这个结果我们可以做一个遍历,若arr中含有数组则使用一次扩展运算符,直至没有为止。
var res = [1,2,[3,[4,[5]]]]
function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}
console.log(flatten(res))
3.4 手写基本的递归

首先想到的肯定是遍历数组,如果某一项是基本数据类型,直接push到新数组,如果某一项是数组,则直接将这一项concat到新的数组上,当然如果是多维数组,还得用上递归的方法,继续往下层寻找,上代码:

var res = [1,2,[3,[4,[5]]]]
function flatten(arr) {
    var result = []
    for (var i = 0; i < arr.length; i++) {
        // console.log(arr[i])
        if (Array.isArray(arr[i])) {
            result = result.concat(flatten(arr[i])) // 如果是数组,则直接拼接到新数组
        } else {
            result.push(arr[i]) // 基本类型数据,直接push到新数组
        }
    }
    return result
}
console.log(flatten(res));

四.数组的排序

4.1 js中的sort()方法

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

	//数组从大到小排序
    var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5, 5, 5];
    function sortNum(arr) {
      arr.sort(function (a, b) {
        return b - a;
      });
    }

    sortNum(arr);
    console.log(arr); // [23, 23, 9, 9, 8, 7, 6, 5, 5, 5, 5, 3, 1, 1, 1, 1]
    
    //数组小到大排序
    function sortNum2(a, b) {
      return a - b;
    }

    var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5, 5, 5];
    arr.sort(sortNum2);
    console.log(arr); //[1, 1, 1, 1, 3, 5, 5, 5, 5, 6, 7, 8, 9, 9, 23, 23]
4.2冒泡排序

基本思想:一次比较两个相邻的数,如果不符合规则互换位置,一次比较就能够将最大或最小的值放在数组最后一位
继续对除【最后一位】之外的所有元素重复上述过程

var arr = [123, 203, 23, 13, 34, 65, 65, 45, 89, 13, 1];
    for (var i = 0; i < arr.length; i++) {
      for (var j = i + 1; j < arr.length; j++) {
        //如果第一个比第二个大,就交换他们两个位置s
        if (arr[i] > arr[j]) {
          var temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
        }
      }
    }
 console.log(arr); //(11) [1, 13, 13, 23, 34, 45, 65, 65, 89, 123, 203]

排序参考文章
https://blog.youkuaiyun.com/weixin_55992854/article/details/116849789

五.取数组的最大值

5.1. es6拓展运算符…
var arr = [66,7,2,0,-3,5];

var a = Math.max(...arr)
console.log(a)
5.2 sort
//3. 数组sort()
var c= arr.reduce((num1, num2) => {
    return num1 > num2 ? num1 : num2}
)
console.log(c)

六.数组是否包含指定的元素

6.1 Arrya.includes() 方法 该函数返回一个布尔值,表示该值是否存在。
 let animals = ["A", "B", "C", "D"]

 console.log(animals.includes("B"))  // true
 console.log(animals.includes("F"))  // false
6.2. Arrya.indexOf() 方法。

在需要查找的元素的确切位置的情况下,可以使用indexOf(elem)方法,该方法在指定的数组中查找elem并返回其第一次出现的索引,如果数组不包含elem则返回-1。

	let grades = ["B", "D", "C", "A"]

    console.log(grades.indexOf("A"))  // 3
    console.log(grades.indexOf("F"))  // -1

    if (grades.indexOf("F") >= 0) {
        console.log("元素存在");
    } else {
        console.log("元素不存在");
    }

七.删除数组(对象数组)中的某一个元素(常用)

####### 7.1 对象数组 forEach splice

	let selectData = [
		{ depId: 44, name: '西安' },
		{ depId: 33, name: '北京' },
		{ depId: 23, name: '上海' },
		{ depId: 35, name: '广州' },
		{ depId: 64, name: '深圳' },
	]

	// 要在数组中删除的数据
	let data = { depId: 23, name: '上海' }

	//  方法1. forEach/findIndex  splice
	let num;
	// selectData.forEach((item, index) => {
	// 	if (item.depId === data.depId) {
	// 		num = index
	// 	}	
	// })
	num = selectData.findIndex(item => item.depId === data.depId)
	
	console.log(num,'num---')
	selectData.splice(num,1)
	console.log(selectData,'selectData---')

####### 7.2 一般数组 indexOf splice 普通数组可以,对象数组不行,要用上边的方法


	let nn = selectData.indexOf(data)
	console.log(nn,'nn---')   //  -1  对象数组不行,要用上边的方法

	let checkData = ["B", "D", "C", "A","h"]
	let id = "C"
	
	let key = checkData.indexOf(id)
	console.log(key,'key---')
	checkData.splice(key,1)
	console.log(checkData,'checkData---')

https://blog.youkuaiyun.com/Li_dengke/article/details/105249837

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值