JavaScript数组挖掘(下)

简介: JavaScript数组挖掘(下)

js数组挖掘_2

数组排序

sort()排序

let a = [1,3,5,8,2];
arr = a.sort(function(a,b){
  return a-b;
})
console.log(arr);//[ 1, 2, 3, 5, 8 ]

let buy = [
  {name:'oppo',price:2000},
  {name:'iPhone',price:8000},
  {name:'vivo',price:2500},
]
console.log(buy.sort(function(a,b){
  return b.price-a.price;
}));
// ┌─────────┬──────────┬───────┐
// │ (index) │   name   │ price │
// ├─────────┼──────────┼───────┤
// │    0    │ 'iPhone' │ 8000  │
// │    1    │  'vivo'  │ 2500  │
// │    2    │  'oppo'  │ 2000  │
// └─────────┴──────────┴───────┘

数组循环

for/in

let arr = [1,3,5,8,2];
for (const index in arr) {
  arr[index]+=10;
}
console.log(arr);//[ 11, 13, 15, 18, 12 ]

for/of

对于引用类型,可以在for/of中改变值,因为为同一内存空间。值类型不行。

for/of只能用来遍历iterable(可迭代类型)

let arr = [{name:'demo'},{name:'node'},{name:'nest'}];
for (const value of arr) {
  value.name = `添加${value.name}`;
}
console.log(arr);//[ { name: '添加demo' }, { name: '添加node' }, { name: '添加nest' } ]

forEach()

const array = [{name:'demo'},{name:'node'},{name:'nest'}];
array.forEach((element,index,array) => {
  // console.log(array); 循环输出n(数组元素个数)次原数组
  console.log(element.name.substr(0,2));
    //输出de
    //no
    //ne
    
  // console.log(array[index].name.substr(1,3)); 
    //输出
    //emo
    //ode
    //est
});

Iterator迭代器

Array.keys()和Array.values()返回的都是Object [Array Iterator] {} 一个数组迭代器对象

迭代器是通过使用 next() 方法实现 Iterator protocol的任何一个对象,该方法返回具有两个属性的对象: value,这是序列中的 next 值;和 done ,如果已经迭代到序列中的最后一个值,则它为 true ,反之为false。如果 value 和 done 一起存在,则它是迭代器的返回值。

Array.entries()可以看做是keys()和values()方法的组合

let arr = [1,2];
let keys = arr.keys();
console.log(keys.next());//{ value: 0, done: false }
console.log(keys.next());//{ value: 1, done: false }
console.log(keys.next());//{ value: undefined, done: true }

let arr1 = ['demo','nest'];
let keys1 = arr1.values();
let {value,done} = keys1.next();//使用对象的解构赋值
console.log(value,done);//demo false

let arr = ['小白','小黑'];
console.log(arr.entries().next());//{ value: [ 0, '小白' ], done: false }

对于迭代器,有专门的for/of来进行循环操作

let arr = ['小白','小黑'];
for (const value of arr) {
  console.log(value);//循环输出 小白 小黑
}

for (const keys of arr.keys()) {
  console.log(keys);
  //输出
  //0
  //1
}

for (const [key, value] of arr.entries()) {
  console.log(key, value);
  //输出
  //0 '小白'
  //1 '小黑'
}

every()和some()

every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。

every() 方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素不满足,则整个表达式返回 false,且剩余的元素不会再进行检测
  • 如果所有元素都满足条件,则返回 true。
let key = ['js','node'];
let every1 = key.every(item => {
  console.log(item);
  return true;
});
console.log(every1);
//输出
//js
//node
//true

let every2 = key.every(item => {
  console.log(item);
  return false;
});
console.log(every2);
//输出
//js
//false

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。

some() 方法会依次执行数组的每个元素:

  • 如果有一个元素满足条件,则表达式返回true, 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false。
let key = ['js','node'];
let every1 = key.some(item => {
  console.log(item);
  return true;
});
console.log(every1);
//输出
//js
//false

let every2 = key.some(item => {
  console.log(item);
  return false;
});
console.log(every2);
//输出
//js
//node
//true

可以用于输入内容是否含有部分或者全部关键词

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="text" name="title">
  <span></span>
  <script>
    let key = ['js','node'];
    let title = document.querySelector('[name="title"]');
    title.addEventListener('keyup',function(){
      const res = key.some(keyword => this.value.includes(keyword));
      document.querySelector('span').innerHTML = res?'':'必须包含js,node关键词'
    });
  </script>
</body>
</html>

数组的filter过滤器

可以用来过滤数组中的指定元素,来生成一个符合要求的新数组

let arr = [
  {title:'js', category:'弱类型'},
  {title:'pyton', category:'弱类型'},
  {title:'ts', category:'强类型'}
];
const newArr = arr.filter(arr => arr['category'] === '弱类型');
console.log(newArr);
// [
//   { title: 'js', category: '弱类型' },
//   { title: 'pyton', category: '弱类型' }
// ]

自定义过滤函数

let arr = [1,2,3,4,5];
function filter(arr,callback){
  let newArr = [];
  for (const value of arr) {
    if(callback(value)) {//这里调用传入函数,实参为遍历的value
      newArr.push(value);
    }
  }
  return newArr;
}
console.log(filter(arr,function(value){
  return value > 2;
}));//[ 3, 4, 5 ]

数组的map映射

map()中的参数为一个函数(必选),函数参数依然为value(必选),index(可选),arr(可选)。

map()返回一个新数组, 不会改变原数组。

let arr = [
  {title:'js', category:'弱类型'},
  {title:'pyton', category:'弱类型'},
  {title:'ts', category:'强类型'}
];

let newArray = arr.map( (value,index,arr)=>{
  return  {
    title: `ham - ${value.title}`,
    category: `ham = ${value.category}`,
    click: 100
  };
})
console.log(arr);
// [
//   { title: 'js', category: '弱类型' },
//   { title: 'pyton', category: '弱类型' },
//   { title: 'ts', category: '强类型' }
// ]

console.log(newArray);
// [
//   { title: 'ham - js', category: 'ham = 弱类型', click: 100 },
//   { title: 'ham - pyton', category: 'ham = 弱类型', click: 100 },
//   { title: 'ham - ts', category: 'ham = 强类型', click: 100 }
// ]

reduce()方法

reduce()基本用法

参数为 一个函数func(必选),初始值initialValue(可选)。func的参数为 上一个返回值previousValue(必选),当前值currentValue(必选),currentIndex(可选),arr(可选)。

若指定了初始值 initialValue,则 currentValue 则将使用数组第一个元素;否则 previousValue 将使用数组第一个元素,而 currentValue 将使用数组第二个元素(这个时候循环次数将会少一次)。

let arr = [1,2,3,4,5];
function func(arr){
  return arr.reduce((pre,cur,index,arr)=>{
      console.log(pre,cur);
      return cur;//返回cur,则pre为上一轮的cur
  },0)//设置pre的初始值,能够循环5(length)次。
}

func(arr);
// 输出
// 0 1
// 1 2
// 2 3
// 3 4
// 4 5

使用reduce()来取最大元素

let arr = [1,2,3,2,2,4];

function func1(arr){
  return arr.reduce((pre,cur)=>{
      return pre > cur ? pre : cur;
  })
}

console.log(func1(arr));// 4

使用reduce()方法来进行计数

写一个函数传入数组和数字,查找元素值为该数字的个数

let arr = [1,2,3,2,2];

function func2(arr,num){
  let total = 0;
  return arr.reduce( (pre,value) => {
    return total += num === value? 1 : 0;
  } )
}
console.log(func2(arr,2));//3

reduce()解决购物车问题

求购物车的商品总价

let car = [
  {name: '笔记本电脑', price: 4000},
  {name: '台式电脑', price: 3500},
  {name: '显示屏', price: 800},
];
function totalPrice(arr){
  let total = 0;
  return arr.reduce((preObj,curObj)=>{
    return total += curObj['price'];
  },0)//需要设置pre初始值为0,cur就会从第一项开始取
}
console.log(totalPrice(car));//8300

按照价格过滤商品

并且输出商品名称

let car = [
  {name: '笔记本电脑', price: 4000},
  {name: '台式电脑', price: 3500},
  {name: 'iPhone', price: 10500},
  {name: 'imac', price: 12500},
  {name: '显示屏', price: 800},
];
function filterGoods(arr,price){
  return arr
    .reduce((newArr,curObj)=>{
    if (curObj.price>price) newArr.push(curObj);
    return newArr;
  },[])
    .map(item => item.name);
}
console.log(filterGoods(car,10000));//[ 'iPhone', 'imac' ]

去除重复的商品

let car = [
  {name: '笔记本电脑', price: 4000},
  {name: '台式电脑', price: 3500},
  {name: '台式电脑', price: 3500},
  {name: '显示屏', price: 800},
  {name: '显示屏', price: 800}
];
function filterGoods(arr){
  return arr.reduce((newArr,curObj)=>{
    let find = newArr.find( v => v.name === curObj.name );
    if (!find) newArr.push(curObj);
    return newArr;
  },[])
}
console.log(filterGoods(car));
// 输出
// [
//   { name: '笔记本电脑', price: 4000 },
//   { name: '台式电脑', price: 3500 },
//   { name: '显示屏', price: 800 }
// ]
相关文章
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
262 5
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
643 4
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
715 3
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
465 2
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
378 1
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
376 0
|
JavaScript 前端开发 索引
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
441 0
|
前端开发 JavaScript 索引
JavaScript 数组常用高阶函数总结,包括插入,删除,更新,反转,排序等,如map、splice等
JavaScript数组的常用高阶函数,包括遍历、插入、删除、更新、反转和排序等操作,如map、splice、push、pop、reverse等。
609 0