美文网首页
js数组面试题总结

js数组面试题总结

作者: 时修七年 | 来源:发表于2018-07-14 12:05 被阅读22次

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JS的一些面试题(数组篇)</title>
</head>
<body>
<script>
/Question:统计一个字符串中出现最多的字符。------------------------------------------------------/
var str = 'wangxiaoaiwangxiaoting';
var o = {};
for(var i = 0; i < str.length; i++) {
var char = str.charAt(i);
// console.log(char);
if(o[char]){ //obj.name 和 obj['name']
o[char]++ //如果对象有这个属性了,就给这个属性自增1
}else{
o[char] = 1 //如果对象没这个属性,就个这个属性值设为1
}
}
console.log(o);
var num = 0;
var number = '';
for (var i in o) { //for in循环 遍历对象的属性和方法
if(num < o[i]){
num = o[i];
number = i
}
}
console.log('最多出现的字符是:'+number+','+'次数是'+num)
/数组去重的几种方法 --------------------------------------------------------------------------/
var arr = [1,1,2,2,7,5,7,5,4,3,3,4,'a','c','a','b','c','b']
//方法一:利用对象属性的存在的特性,如果没有该属性则存入数组
function unique1(arr) {
var res = [];
var obj = {};
for(var i = 0; i<arr.length; i++){
if(!obj[arr[i]]){ //obj[arr[i]]为obj对象的属性值
obj[arr[i]] = 1;
res.push(arr[i])
}
}
return res;
}
console.log(unique1(arr));
//方法二:利用数组的indexOf
function unqiue2(arr) {
var res = [];
for(var i = 0; i<arr.length; i++){
if(res.indexOf(arr[i])==-1){ //或 arr.indexOf(arr[i])==i,即arr[i]第一次出现就push进res,再次出现就不符合条件,不再push。
res.push(arr[i])
}
}
return res;
}
console.log(unqiue2(arr));
//方法三:数组原型对象上的的includes方法
function unique3(arr) {
var res = [];
for(var i = 0 ;i < arr.length; i++){
if(!res.includes(arr[i])){
res.push(arr[i])
}
}
return res;
}
console.log(unique3(arr));
//方法四:排序后相邻去重 思路:原数组排序,排序后相同值相邻,然后遍历时新数组只传入不与前一个值相同的值
function unique4(arr) {
arr.sort(); //排序后arr已经改变了
var res = [arr[0]];
for(var i = 1; i<arr.length; i++){
if(arr[i] !== res[res.length-1]){
res.push(arr[i])
}
}
return res;
}
console.log(unique4(arr));
//方法五:优化遍历数组
function unique5(arr) {
var res = [];
for(var i = 0; i < arr.length; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i] == arr[j]){
++ i; //与右边的元素依次比较,若有重复,则跳出内层循环,重新开始。
}
}
res.push(arr[i])
}
return res;
}
console.log(unique5(arr))
//方法六:ES6 Set数据结构类似于数组,其成员都是唯一的 IE系列不兼容
function unique6(arr) {
// return Array.from(new Set(arr)) ;//Array.from 将Set结构转换成数组
return [...(new Set(arr))]
}
console.log(unique6(arr))
//方法七:ES6
function unique7(arr) {
const res = new Map();
return arr.filter((a)=>!res.has(a)&&res.set(a,1))
}
console.log(unique7(arr));
/数组clone(深、浅拷贝) ----------------------------------------------------------------/
var arr1 = arr.concat();//方法1 concat(),深拷贝
var arr2 = arr.slice(0);//方法2 slice(),深拷贝
var arr3 = []; //方法3 for循环,浅拷贝
for(var i in arr){
arr3[i] = arr[i]
}
/**
* 深拷贝 ,如果数组里含有对象
/
function deepClone(arr) {
var res = [];
for (var i in arr){
if (typeof arr[i] === 'object') { //如果含有对象,则递归
res[i] = deepClone(arr[i])
}else{
res[i] = arr[i]
}
}
return res
}
/
找出数组中的最大值 -------------------------------------------------------------/
var arrMax = [1,2,3,4,5];
//1.for循环,古老的写法,遍历之后取最大值
var arrRes = arrMax[0];
for(var i = 1 ;i <arrMax.length; i++){
var result = Math.max(arrRes,arrMax[i])
}
console.log(result)
//2.Math最大值。用到apply方法,可以将数组转换成参数列表再调用Math方法
Math.max.apply(null,arrMax)
//3.sort()
arrMax.sort((num1,num2) => {return num2-num1})[0] //或者sort()后reverse()
//4.reduce()
arrMax.reduce((num1,num2) => {return num1 > num2 ? num1 : num2})
/
数组降维 -------------------------------------------------------------------/
var arrDown = [[1,2,3],[4,5],[9,8,7]];
//1.二维数组,双层遍历
function down(arr) {
var resDown = [];
for(var i = 0;i < arr.length; i++){
for (var j = 0; j < arr[i].length; j++){
resDown.push(arr[i][j])
}
}
return resDown
}
console.log(down(arrDown))
//2.concat()
function down2(arr) {
var resDown = [];
for(var i = 0; i < arr.length; i++){
resDown = resDown.concat(arr[i])
}
return resDown
}
console.log(down2(arrDown))
//3.concat()和apply()结合
function down3(arr) {
var resDown = [];
return Array.prototype.concat.apply(resDown,arr)
}
console.log(down3(arrDown))
/
数组排序 ---------------------------------------------------------------*/
//1.冒泡排序
var arrs = [3,2,5,9,1,6,33,4,65,22];
var temp = 0;
for(var i = 0; i < arrs.length; i++){
for(var j = i+1; j < arrs.length;j++){
if(arrs[i] > arrs[j]){ //相邻比较,如果前一个大,就调换位置
temp = arrs[i];//temp储存前一个大的数
arrs[i] = arrs[j];//前一个换成小的那个数
arrs[j] = temp//将大的赋值给后一个
}
}
}
console.log(arrs)
//2.快速排序
function quickSort(arr) {
if(arr.length <= 1) return arr;
var middleIndex = Math.floor(arr.length/2);//取中间值
var middle = arr.splice(middleIndex,1);//删除并返回这个值,即把中间这个值拿出来用作比较
var left = [];
var right = [];
for(var i = 0; i < arr.length; i ++){
if(arr[i] > middle){ //遍历,比这个大的放在right数组,小的放在left数组
right.push(arr[i])
}else{
left.push(arr[i])
}
}
return quickSort(left).concat(middle,quickSort(right));//递归 直到length<=1
}
console.log(quickSort(arrs));
//3.选择排序
function selectSort(arr) {
var minIndex, temp;
for(var i = 0; i < arr.length-1; i++){
minIndex = i;
for(var j = i+1; j<arr.length; j++){
if(arr[j] < arr[minIndex]){
minIndex = j
}
}
temp = arr[i];
arr[i] =arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
console.log(selectSort(arrs))
</script>
</body>
</html>

相关文章

  • js数组题目

    js面试题 js数组 一、按要求分割数组 将"js,数组,分类"字符串数组以/分割 for循环累加 join()把...

  • 原生JS实现对象数组深拷贝

    原生JS实现对象数组深拷贝已经是一个老生常谈的面试题了,下面我将方法总结出来

  • js数组面试题总结

    JS的一些面试题(数组篇) /Question:统计一个字符串中出现最...

  • js常见面试题

    总结了一些常见的js面试题,欢迎大家评论补充。!!!注意不要一味的死记硬背,掌握原理才是关键。 数组去重 var ...

  • 前端面试必问总结

    前言 本文用于总结个人在工作期间总结的一些面试题 题目列表 js的函数声明 js的原型链 js的闭包 js的Pro...

  • 前端常见的js数组操作面试题集合

    前端常见的js数组操作面试题集合 一、按要求分割数组 //实例: 将 “刘备,张飞,关羽” 一个字符串数组以“|”...

  • 2020年,精选大厂的iOS面试题总结(二)

    面试题目录(二) 精选大厂的iOS面试题总结(一)精选大厂的iOS面试题总结(二) 1. 统计一个字符数组中每个字...

  • 前端面试题之js篇(以及网络协议、储存)

    JS面试题 js基本类型和引用类型说说写JavaScript的基本规范?js如何判断一个对象是数组怎么判断两个对象...

  • JS数组总结

    数组的创建 数组的创建有三种方式:构造函数方式、字面量方式、ES6新增的Array.of()方法创建。 构造函数方...

  • js中的循环遍历方法对比

    JS循环大总结, for, forEach,for in,for of, map区别 map(数组方法): 特性:...

网友评论

      本文标题:js数组面试题总结

      本文链接:https://www.haomeiwen.com/subject/httypftx.html