依据小兔鲜项目,总结Javascript数组常用方法

find

在向购物车添加某种规格的商品时,查找购物车列表中是否已经存在该规格的商品

find()方法传入一个回调函数,代表对数组每一项item的校验要求

返回数组中第一个符合条件的元素的值,如果没有则返回undefined

        const item = cartList.value.find(
          (item) => goods.skuId === item.skuId
        );

        if (item) {
          // 找到了,该规格商品的数量+1
          item.count++;
        } else {
          // 没找到,数组加入该商品
          cartList.value.push(goods);
        }

reduce

用于计算购物车中商品的数量总数/ 用于计算购物车中的总金额

reduce()方法传入的参数为两个,一个是用于累计的回调函数(它将为数组中每一个元素依次执行回调函数),另一个是初始值

返回累计值,即回调函数中的第一个参数(最后计算得到的结果)

    // 计算属性
    // 1. 总的数量 所有项的count之和
    const allCount = computed(() =>
      cartList.value.reduce((a, c) => a + c.count, 0)
    );
    // 0是初始值,a是累加项,c是每一项
    // 2. 总价 所有项的count*price之和
    const allPrice = computed(() =>
      cartList.value.reduce((a, c) => a + c.count * c.price, 0)
    );

filter

用于计算购物车中被选中的商品的数量总数/用于计算购物车中被选中的商品总金额

filter()方法传入一个回调函数,代表对数组每一项item的校验要求

返回一个新数组,包含所有符合要求的元素

    // 3.已选择数量
    const selectedCount = computed(() =>
      cartList.value
        .filter((item) => item.selected)
        .reduce((a, c) => a + c.count, 0)
    );

    // 4. 已选择商品价钱合计
    const selectedPrice = computed(() =>
      cartList.value
        .filter((item) => item.selected)
        .reduce((a, c) => a + c.count * c.price, 0)
    );

forEach

用于在购物车点击“全选”单选框,购物车中的每一个商品都是选中/没有选中的状态

forEach()方法传入一个回调函数,代表对数组每一项item的操作

返回undefined(不返回新数组)

    // 全选功能
    const allCheck = (selected) => {
      cartList.value.forEach((item) => (item.selected = selected));
    };

every

用于计算,当购物车中的每一个商品都被选中时,“全选”单选框应处于选中状态

                  当存在购物车中的商品没有被选中时,“全选”单选框应处于没有被选中的状态

every()方法用于检测数组中所有元素都符合指定条件

          传入一个回调函数,代表对数组中每一项item的校验要求(回调函数返回true或false)

          返回一个布尔值,如果数组中所有元素都通过校验则返回true,否则返回false

    // 是否全选
    const isAll = computed(() => cartList.value.every((item) => item.selected));

findIndex

用于寻找,将要被删除的某种规格的商品所处数组中的下标值,

并通过splice方法删除处于该下标的商品

findIndex()方法传入一个回调函数,代表对数组每一项item的校验要求

返回数组中第一个符合条件的元素的下标位置,如果没有符合条件的则返回-1

    // 删除购物车中的商品
    const delCart = async (skuId) => {
      if (isLogin.value) {
        // 调用接口实现接口购物车中的删除功能
        await delCartAPI([skuId]);
        updateNewList()
      } else {
        // 思路:
        // 1. 找到要删除项的下标值(通过下标值删除该项) -splice
        // 2. 使用数组的过滤方法 -filter
        const idx = cartList.value.findIndex((item) => skuId === item.skuId);
        cartList.value.splice(idx, 1);
      }
    };

splice

小兔鲜项目中的例子同上

splice()方法用于在数组中删除、替换和插入元素(参考博客:js中的splice的三种用法(删除,替换,插入)_js splice替换-CSDN博客)

array.splice(index,howmany,item1,.....,itemX)

        传入第一个参数index为将要被删除的起始元素的下标值,

         传入第二个元素为从index下标值开始,要删除的元素数量

          传入的第三个(item1)及以后的参数表示为,从该位置删除后,插入的元素列表

返回被删除的元素组成的数组,如果要获取被删除元素后的数组,直接调用原来的数组即可

(参考博客:关于js中splice方法返回的结果_splice的返回值-CSDN博客)

push

用于向购物车末尾添加商品

push()方法用于向数组末尾添加一个或多个元素

         可以传入多个参数,为向数组末尾添加的元素列表

        (参考博客:JavaScript push() 方法添加元素)

        返回数组的新长度

    const addCart = async (goods) => {
      const { skuId, count } = goods;
      if (isLogin.value) {
        // 登录之后的加入购物车逻辑
        await insertCartAPI({ skuId, count });
        updateNewList()
      } else {
        // 添加购物车操作
        // 已添加过 -count + 1
        // 没有添加过 -直接push
        // 思路: 通过匹配传递过来的商品对象中的skuId能不能在cartList中找到,找到了就是添加过
        const item = cartList.value.find(
          (item) => goods.skuId === item.skuId
        );
        if (item) {
          // 找到了
          item.count++;
        } else {
          // 没找到
          cartList.value.push(goods);
        }
      }
    };

map

用于在向后端合并购物车接口传递参数时,重组数组每一项的形式

map()方法用于对数组中每一个元素,依次按照函数处理

        传入一个回调函数,代表对数组每一项item的操作

        返回一个新数组,新数组中的每个元素为原数组中的每个元素依次调用函数处理后的值

    // 2. 定义获取接口数据的action函数
    const getUserInfo = async ({ account, password }) => {
      const res = await loginAPI({ account, password });
      userInfo.value = res.result;
      // 合并购物车的操作
      await mergeCartAPI(cartStore.cartList.map(item => {
        return {
          skuId: item.skuId,
          selected: item.selected,
          count: item.count
        }
      }))
      cartStore.updateNewList()
    };

延伸

数组初始化

  1. 指定长度的初始化
    var vArray = new Array(8);
  2. 不指定长度的初始化
    var vArray = new Array();
    vArray .push(1);
    
    
    var vArray = [];
    vArray .push(1);

    3.直接对数组进行赋值

    var vArray = ['1','2','3'];

slice

slice()方法用于截取数组的一部分

array.slice(startend)

        传入的第一个参数start代表从哪个下标位置开始选取数组元素(可为负数,表示倒数第几个)

        传入的第二个参数end代表在哪个下标位置结束(可为负数,表示倒数第几个)

返回一个新的数组,即截取后的数组

var arr = [1,2,3,4,5];
console.log(arr.slice(1,5)) //[2, 3, 4, 5]
var arr = [1,2,3,4,5];
console.log(arr.slice(-3)) //[3, 4, 5]

pop

pop()方法用于删除数组最后一个元素

不需要传递参数

返回被删除的元素

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

shift

shift()方法用于删除数组首部的元素

不需要传递参数

返回被删除的元素

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

unshift

push()方法用于向数组开头添加一个或多个元素

array.unshift(item1,item2, ..., itemX)

         可以传入多个参数,为向数组开头添加的元素列表

        返回数组的新长度

var len = arr.unshift(0);
console.log(arr); // [0, 1, 2, 3]
console.log(len); // 4
len = arr.unshift(-2,-1);
console.log(arr);  // [-2, -1, 0, 1, 2, 3]
console.log(len);  // 6

indexof

indexof()方法用于查找数组中某个元素首次出现的位置

array.indexOf(item,start)

        传入的第一个参数item代表要查找的元素

        第二个参数可不传,代表从哪个下标位置开始查找元素

若找到,返回查找到的元素的位置;如果没有找到,返回-1

var arr = [1,2,3,5,6,7];
console.log(arr.indexOf(6)) //4 返回索引位置。
console.log(arr.indexOf(8)) //如果是数组中没有的元素,返回-1

concat

用于连接两个或多个数组

array1.concat(array2, array3,..., arrayX)

传入的参数为一个或多个数组

返回一个新数组,即为连接后的数组

(参考:JavaScript concat() 方法 | 菜鸟教程)

const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = array1.concat(array2);
 
console.log(array3);  // 输出:['a', 'b', 'c', 'd', 'e', 'f']
const array1 = ['a', 'b', 'c'];
const array2 = ['d', 'e', 'f'];
const array3 = ['g', 'h', 'i'];
const array4 = array1.concat(array2, array3);
 
console.log(array4);  // 输出:['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

join

用于把数组中的所有元素连接为一个字符串

array.join(separator)

传入的参数为,可以指定的分隔符;可以省略该参数,如果省略的话,默认用逗号进行连接

返回连接而成的字符串

(参考:JavaScript join() 方法 | 菜鸟教程)

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var energy = fruits.join();//Banana,Orange,Apple,Mango
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var energy = fruits.join(" and ");//Banana and Orange and Apple and Mango

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode热题100】【双指针】盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 示例…

Java架构师技术为业务赋能

目录 1 概论2 天猫的难言之隐3 如何拆解技术难点-三段论4 天猫线的破局之道-双引擎回归测试框架5 架构师的心理游戏-解决问题从转换思维开始6 技术助力业务的两个方向7 阿里新零售部门如何培养技术团队的业务知识8 如何围绕业务特点制定技术发展路线-阿里系和抖音案例9 阿里系业…

Ubuntu20.04安装ROS2

官方参考文章 Ubuntu (Debian) — ROS 2 Documentation: Foxy documentation curl密钥问题 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg curl: (7) Failed to connect to raw.githubus…

pytorch 模型量化quantization

pytorch 模型量化quantization 1.workflow1.1 PTQ1.2 QAT 2. demo2.1 构建resnet101_quantization模型2.2 PTQ2.3 QAT 参考文献 pytorch框架提供了三种量化方法,包括: Dynamic QuantizationPost-Training Static Quantization(PTQ&#xff0…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路,可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下: yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me! 我们输入命令 unzi…

【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】

文章目录 一、Jacobi 旋转法二、Jacobi 过关法三、Householder 方法1. 旋转变换a. 旋转变换的选择b. 旋转变换的顺序 2. Householder矩阵(Householder Matrix)a. H矩阵的定义b. H变换的几何解释c. H变换的应用场景 3. H变换过程详解a. 过程介绍b. 细节解…

全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解

JSSDK使用步骤 步骤一:绑定安全域名: 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件: 在需要调用JS接口的页面引入如下JS文件,(支持https):http://…

业务数据治理体系化实施流程学习总结

目录 一、业务数据治理实施流程 步骤 1:发现问题和制定目标 步骤 2:针对问题进行拆解,设计可衡量的指标 步骤 3:制定解决SOP和检查研发标准规范 步骤 4:推广运营,以拿结果为核心目标 步骤 5&#xff…

matlab科学计算

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

ARM架构安装RabbitMQ

1.查看centos内核版本 uname -a uname -r2.安装之前的准备工作 安装RabbitMQ必装Erlang(RabbitMQ官网添加链接描述) 2.1.Erlang简介 Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对…

【Java基础篇 | 面向对象】—— 聊聊什么是多态(下篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、动态绑定和静态绑…

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…

【微信小程序】上传头像 微信小程序内接小程序客服

这里写目录标题 微信小程序上传头像使用button按钮包裹img 微信小程序内接小程序客服使用button按钮跳转客服 微信小程序上传头像 使用button按钮包裹img 原本思路是只使用image标签再加上chooseImg,但发现使用button标签上传头像这种方法更实用。微信小程序文档上…

栈实现队列,力扣

题目地址: 232. 用栈实现队列 - 力扣(LeetCode) 难度:简单 今天刷栈实现队列,大家有兴趣可以点上看看题目要求,试着做一下。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

简单句子成分、阅读技巧

四、段落的主旨题:问这一段讲了什么(一般都在段落的第一句话或最后一句话) 词汇题的答案一般都在生词的上一句或者下一句 做题步骤: 1、先标段落 2、看题,划出关键词 3、去原文定位,标注中文意思 4、第一遍…

类和对象——(5)定义对象数组

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 芳华没有草稿纸,我们永久不…

异常(C++)

异常 前言一、程序的错误分类二、异常1. 概念2. 捕获异常的关键字和格式3. 异常的使用异常的原则异常再抛出异常说明注意事项 4. 自定义异常体系5. C标准库的异常体系 三、总结 前言 在程序运行时经常碰到一些错误,例如年龄、身高不能为负,除数为0等&…

阿里微服务质量保障系列:性能监控最佳实践

建设一体化性能监控平台 随着互联网技术的不断发展,企业的业务规模和复杂度也在不断增加。为了保证业务的稳定性和可靠性,企业需要对其系统进行全面的性能监控。而一体化性能监控就是一种集成了多种监控工具和技术的综合性监控方案,可以帮助…

PPT设置背景颜色

问题描述:PPT如何设置背景颜色? 问题解决:设计→设置背景格式→颜色→蓝色(最好选择看着比较舒服的颜色)

软件设计模式原则(三)单一职责原则

单一职责原则(SRP)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原…