前端数组操作

1.基本特点

方法返回值类型特点

参数

v:项,

i:索引,

selfArr:数组本身‘

acc:上一次返回值

map()返回新数组,不改变原数组迭代每一项,不可使用break,continue,return,适用于小数据量(v,i,selfArr)
filter()过滤(v,i,selfArr)
reduce()汇总数据

详细如下场景

forEach()无返回值遍历数组
find()返回合适的项只返回第一个匹配的元素
sort()修改原数组排序
some()true/false数组中只要有一个满足条件就返回true,否则返回false
every()都满足返回true
includes()是否包含特定的值

2.项目中用的场景

 map()

场景一:选列表中id 数组给后端
const tableData = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' }
];
const idArr= tableData .map(v=> v.id); // [1, 2]
场景二:格式化后端传来的数据
data() {
    return {
        auditType: {
            "aaa": "审核通过",
            "审核通过": "审核通过",
            "bbb": "审核不通过",
            "ddd": "待审核",
            "待审核": "待审核"
        },
    }
}

 methods: {
    mapAuditType(value) {
      return this.auditType[value] || value;
    },
    queryData(){
        this.listArr = this.listArr.map( item =>{
            const [year,month] = item.SETTLEMENT_MONTH.split("-");
             return {
                ...item,
                yearMonth:`${year}-${month}`,//返回的年月日只显示年月
                aaaaName:item.SETTLEMENTName,//修改很复杂的字段
                PROCESS_STEP:this.mapAuditType(item.PROCESS_STEP)}//根据传来的值按规则转为需要的值
        })
    }
}
场景三:去掉数组里的某个属性留下其他的
const data = [
  { name: 'Alice', age: 30, city: 'Wonderland' },
  { name: 'Bob', age: 25, city: 'Builderland' },
  { name: 'Charlie', age: 35, city: 'Chocoland' }
];

// 先用 map() 去掉 age 属性
const mappedData = data.map(({age,...rest})=>rest);
console.log(mappedData);
[
    {
        "name": "Alice",
        "city": "Wonderland"
    },
    {
        "name": "Bob",
        "city": "Builderland"
    },
    {
        "name": "Charlie",
        "city": "Chocoland"
    }
]

filter()

场景一:过滤下拉框合适的值
<el-option 
    v-for="item in bankCities.filter(v => v.code>10)"
    :key="item.code"
    :label="item.name"
    :value="item.code" >
</el-option>
场景二:过滤某个为true的布尔值
const tasks = [
  { task: 'Do laundry', done: true },
  { task: 'Buy groceries', done: false },
  { task: 'Read book', done: true }
];

const completedTasks = tasks.filter(task => task.done);
console.log(completedTasks); // [{ task: 'Do laundry', done: true }, { task: 'Read book', done: true }]
场景三:定义下拉框值对应的name

data(){
    return {
        form:{
          code:"",
          name:"",
        }
        citiesArr :[{code:1,name:"上海"},{code:2,name:"北京"}]
    }
} 
method:{
    changeCity(val) {
      this.form.code= val;
      this.form.name= this.citiesArr.filter(v => v.code== val)[0].name;
    },
}
    
场景四:显示对应的值
<div >
      {{ arr.filter(v => v.code== this.code)[0].name }}
 </div>
data(){
    return:{
        arr:[],
        code:1,//从接口获取
    }
}
场景五:过滤调数组里的 ""  undefined null
const inputData = ['hello', '', 'world', null,undefined, 'JavaScript'];
const validData = inputData.filter(item => item);
console.log(validData);

VM110:3 (3) ['hello', 'world', 'JavaScript']
场景六:去重
const arr = ['apple', 'banana', 'apple', 'orange', 'banana'];
const uniqueItems = arr.filter((v,i,selfArr)=>selfArr.indexOf(v) === i)
console.log(uniqueItems); // ['apple', 'banana', 'orange']

VM618:3 (3) ['apple', 'banana', 'orange']

 reduce()

详细参数介绍
1.有没有初始值
array.reduce(callbackFn, initialValue);
没初始值
    const result = numbers.reduce((acc, curr) => acc + curr);
    console.log(result); // 输出 10
有初始值
    const numbers = [1, 2, 3, 4];
    const result = numbers.reduce((acc, curr) => acc + curr,0);
    console.log(result); // 输出 10
2.callBack的参数
    acc:上一次调用 callbackFn 的返回值
    v:当前元素
    i:当前索引
    arrSelf:数组本组
场景一:用来累计当页面的input框填写金额时可以不断添加,并且动态合计在页面上
2个参数(一般2个参数起步)

<span>{{ applaysumAward }}</span>
 data () {
    return {
      awardList: [
        {  amount: '', policyNum: '',serviceProduct:"", premium:""},
      ]
    }
  },
 computed: {
    applaysumAward() {
      let total = this.awardList.reduce((sum, item) => {
        return sum + parseFloat(item.amount || 0);
      }, 0); 
      return total.toFixed(2);
    }
  },
场景二:按同样的条件分组
const data = [
  { type: 'fruit', name: 'apple' },
  { type: 'vegetable', name: 'carrot' },
  { type: 'fruit', name: 'banana' },
  { type: 'vegetable', name: 'broccoli' }
];

const grouped = data.reduce((acc, curr) => {
  // 查找当前 type 是否已经存在于累加器中
  let group = acc.find(g => g.type === curr.type);  
  if (!group) {
    // 如果没有找到对应的分组,则创建一个新的分组
    group = { type: curr.type, nameArr: [] };
    acc.push(group);
  } 
  // 将当前项的 name 添加到对应分组的 nameArr 中
  group.nameArr.push(curr.name);
  
  return acc;
}, []);
console.log(grouped);
// [
    {type:'fruit',nameArr:['apple','banana']},
    {type:'vegetable',nameArr:['carrot','broccoli']}
]
3个参数 
const numbers = [1, 2, 3, 4];
const result = numbers.reduce((acc, v, i) => {
  console.log(`Index ${i}: ${v}`);
  return acc + v;
}, 10);
console.log(result); // 输出 20
4个参数
const numbers = [1, 2, 3, 4];
const result = numbers.reduce((acc, v, i, selfArr) => {
  console.log(`Array: ${selfArr}`);
  return acc + v;
}, 10);
console.log(result); // 输出 20

find()

场景一:用来将取某个值对应list的值
textChoose(val) {
      this.typeText = this.option1.find(v => v.value == val).text;
      this.typeVaule = this.option1.find(v => v.value == val).type;
 },

sort()

场景一:普通升序
let arr=[5,3,4,5,1,6] ;
console.log(arr.sort()) //[1, 3, 4, 5, 5, 6]
console.log(arr.sort((a,b)=>a -b)) //[1, 3, 4, 5, 5, 6]
console.log(arr.sort((a,b)=>b - a)) // [6, 5, 5, 4, 3, 1]
场景二:降序排时间(值可能没有需要兼容)
// 倒序
this.listArr.sort((a, b) => {
  const aHasApplyTime = !!a.applyTime; //true 如果 a.applyTime 存在(即不是 null, undefined, 0, '' 等假值)
  const bHasApplyTime = !!b.applyTime;
  if (!aHasApplyTime && bHasApplyTime) return 1; // a没有APPLY_TIME,b有APPLY_TIME,a排在后面
  if (aHasApplyTime && !bHasApplyTime) return -1; // a有APPLY_TIME,b没有APPLY_TIME,a排在前面
  if (!aHasApplyTime && !bHasApplyTime) return 0; // 都没有APPLY_TIME,保持原顺序
  return new Date(b.applyTime) - new Date(a.applyTime); // 都有APPLY_TIME的情况
});;
场景三:比较2个数组是否相等, 数组里不能有对象
let arr=[1,3,4,5,6] ;
let brr=[1,3,4,5,6]
function compArray(array1, array2) {
    //比较2个数组是否相等, 数组里不能有对象
    array1.sort();
    array2.sort();
    return (
        array1.length == array2.length &&
        array1.every((v, i) =>v === array2[i])
    );
}
console.log(compArray(arr,brr))
VM527:12 true
场景四:选取数组中最小的数
this.awardList.sort()[0]

some()

场景一:确定这个value在数组列表里
verifyNum(e,item){
  if(this.awardList.length && this.awardList.some(v=>v.Num == item.num)){
   console.log('填写数字不能重复')
    return
  }
场景二:检查一个用户列表中是否有用户处于在线状态。
const users = [
  { name: 'Alice', online: false },
  { name: 'Bob', online: true },
  { name: 'Charlie', online: false }
];
const isAnyUserOnline = users.some(v=>v.online);
console.log(isAnyUserOnline); // true
场景三:表单验证是否有必填字段为空
const formData = [
  { name: 'username', value: 'John' },
  { name: 'email', value: '' },
  { name: 'password', value: 'password123' }
];

const hasEmptyFields = formData.some(v=>v.value.trim() === '')
console.log(hasEmptyFields); // true
场景四:来检查数组中的元素是否具有某个特性
const features = ['touch', 'gps', 'camera'];

const hasCamera = features.some(v=>v==="camera");
console.log(hasCamera); // true

VM1187:4 true

every()

场景一:提交表单对象里某个值不能为空
function fieldsAreEmpty(obj) {
  // 检查所有字段是否为空字符串
  return Object.values(obj).every(value => value != "");
}
let obsTest = {
    aaa:'111',
    bbb:'111',
}
fieldsAreEmpty(obsTest)
true
场景二:A列表的每一项都在B列表里
const allowedValues = ['option1', 'option2', 'option3'];
const selectedValues = ['option1', 'option2'];

const hasInvalidValue = selectedValues.every(value => allowedValues.includes(value));
console.log(hasInvalidValue); // true

includes()

场景一:在处理表单数据时,可以使用 includes() 来检查是否包含特定的值。例如,检查用户选择的选项是否在允许的选项中。
const validColors = ['red', 'green', 'blue'];
const userColor = 'green';

const isValidColor = validColors.includes(userColor);
console.log(isValidColor); // true

VM1734:5 true
场景二:选择的值列表中是否有1一个在全部允许列表中
const allowedValues = ['option1', 'option2', 'option3'];
const selectedValues = ['option1', 'option4'];

const hasInvalidValue = selectedValues.some(value => allowedValues.includes(value));
console.log(hasInvalidValue); // true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值