Skip to content

js中的数组操作

数组的遍历

  1. for
js
let arr = [7, 5, 9];
// console.dir(arr);

for(let i=0; i<arr.length; i++){
	console.log(arr[i]);
}
let arr = [7, 5, 9];
// console.dir(arr);

for(let i=0; i<arr.length; i++){
	console.log(arr[i]);
}
  1. for in
js
let arr = [7, 5, 9];

for(let key in arr){
	console.log(arr[key]);
}
let arr = [7, 5, 9];

for(let key in arr){
	console.log(arr[key]);
}

数组的增加、修改、删除

1. 向数组末尾新增一项(push)

js
let arr = [7, 5, 9];

arr.push(111);
console.dir(arr);
let arr = [7, 5, 9];

arr.push(111);
console.dir(arr);

2. 返回值(长度)

js
let arr = [7, 5, 9];

let res = arr.push(999, "qqq");
console.log(res, arr);
let arr = [7, 5, 9];

let res = arr.push(999, "qqq");
console.log(res, arr);

3. 删除数组中的最后一项(pop)

js
let arr = [7, 5, 9];

let res = arr.pop();
console.log(res, arr);

arr.length--;
console.log(arr);
let arr = [7, 5, 9];

let res = arr.pop();
console.log(res, arr);

arr.length--;
console.log(arr);

4. 删除数组中的第一项(shift)

js
let arr = [7, 5, 9];

let res = arr.shift();
console.log(res, arr);
let arr = [7, 5, 9];

let res = arr.shift();
console.log(res, arr);

5. 向数组开头增加一项(unshift)

js
let arr = [7, 5, 9];

let res = arr.unshift(1000);
console.log(res, arr);
let arr = [7, 5, 9];

let res = arr.unshift(1000);
console.log(res, arr);

实现增加、删除、修改(splice)

1. 删除

js
let arr = [55, 88, 99, 33, 66, 44, 22];
console.log(arr);

//删除
//ary.splice(n, m) 从索引n开始,删除m个元素,把删除的内容以一个新数组的方式返回
//ary.splice(n) 从索引n开始,删除到数组末尾
//ary.splice(0),清空数组(克隆之前的数组)
//ary.splice()未删除,返回原数组
let res = arr.splice(1, 3);
console.log(res, arr);
let arr = [55, 88, 99, 33, 66, 44, 22];
console.log(arr);

//删除
//ary.splice(n, m) 从索引n开始,删除m个元素,把删除的内容以一个新数组的方式返回
//ary.splice(n) 从索引n开始,删除到数组末尾
//ary.splice(0),清空数组(克隆之前的数组)
//ary.splice()未删除,返回原数组
let res = arr.splice(1, 3);
console.log(res, arr);

2. 修改

js
let arr = [55, 88, 99, 33, 66, 44, 22];

//splice(n, m, x),从索引n开始,删除m个,用x修改
let res = arr.splice(1, 3, 1000);
console.log(res, arr);
let arr = [55, 88, 99, 33, 66, 44, 22];

//splice(n, m, x),从索引n开始,删除m个,用x修改
let res = arr.splice(1, 3, 1000);
console.log(res, arr);

3. 增加

js
let arr = [55, 88, 99, 33, 66, 44, 22];

//splice(n, 0, x),从索引n开始,不删除,把x放在n前面
let res = arr.splice(1, 0, 1000);
console.log(res, arr);
//增加到末尾
let res = arr.splice(arr.length, 0 , 2000);
console.log(res, arr);
let arr = [55, 88, 99, 33, 66, 44, 22];

//splice(n, 0, x),从索引n开始,不删除,把x放在n前面
let res = arr.splice(1, 0, 1000);
console.log(res, arr);
//增加到末尾
let res = arr.splice(arr.length, 0 , 2000);
console.log(res, arr);

数组的截取和拼接(slice截取)

js
// slice(n, m), 从索引n开始,找到索引m处,不包含m
// slice(n),从索引n开始,找到数组的末尾
// concat 把两个数组拼接到一起
// slice(n, m), 从索引n开始,找到索引m处,不包含m
// slice(n),从索引n开始,找到数组的末尾
// concat 把两个数组拼接到一起

数组转换成字符串

  • toString
js
// join("x"),用x分隔字符串

let arr = [55, 88, 99, 33, 66, 44, 22];
console.log(arr.join("+"));

// eval把js中字符串转换成js表达式(求和)
console.log(eval(arr.join("+")));
// join("x"),用x分隔字符串

let arr = [55, 88, 99, 33, 66, 44, 22];
console.log(arr.join("+"));

// eval把js中字符串转换成js表达式(求和)
console.log(eval(arr.join("+")));

倒序排列(reverse)

js
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.reverse();
console.log(res);
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.reverse();
console.log(res);

sort(从大到小排序)(按Unicode码)

js
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.sort();
console.log(res);

let res = arr.sort(function(a, b){
	// return a - b;	//从小到大排序
	// return b - a;	//从大到小排序
});

//indexOf,验证是否存在(不存在返回-1)
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.sort();
console.log(res);

let res = arr.sort(function(a, b){
	// return a - b;	//从小到大排序
	// return b - a;	//从大到小排序
});

//indexOf,验证是否存在(不存在返回-1)

遍历数组forEach、map

js
let arr = [55, 88, 99, 33, 66, 44, 22];

arr.forEach(function(item, index){
	console.log(item, index);
});
let arr = [55, 88, 99, 33, 66, 44, 22];

arr.forEach(function(item, index){
	console.log(item, index);
});

返回的新数组每项都*10(替换原来的数组)

js
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.map(function(item, index){
	return item * 10;
});
console.log(res);
let arr = [55, 88, 99, 33, 66, 44, 22];

let res = arr.map(function(item, index){
	return item * 10;
});
console.log(res);

使用filter判断对象数组中是否有某个值

js
let result = group_obj.filter((item) => {
	return item.userId === 20027796
})
let result = group_obj.filter((item) => {
	return item.userId === 20027796
})

根据索引删除数组元素

js
// 根据索引删除数组元素
delArrEleByIndex(arr, indexsArr) {
    indexsArr.sort(function(a, b) { return b - a});
    
    indexsArr.forEach(function(indexsArr) { arr.splice(indexsArr, 1) })

    return arr;
},
// 根据索引删除数组元素
delArrEleByIndex(arr, indexsArr) {
    indexsArr.sort(function(a, b) { return b - a});
    
    indexsArr.forEach(function(indexsArr) { arr.splice(indexsArr, 1) })

    return arr;
},

js中数组倒序

res.data.reverse()

使用find遍历

js
// 量价明细下拉当明细表有数据则禁用
judgeDetailData() {
    // 遍历明细表
    for(let item in this.purchaseDetquaInfo) {
        // 遍历字典
        this.constTradeingType.find(typeItem=> {
            if(this.purchaseDetquaInfo[item].tradingType === typeItem.value) {

            typeItem.disabled = true;
            }
            // item.disabled=true
        })
    }
},
// 量价明细下拉当明细表有数据则禁用
judgeDetailData() {
    // 遍历明细表
    for(let item in this.purchaseDetquaInfo) {
        // 遍历字典
        this.constTradeingType.find(typeItem=> {
            if(this.purchaseDetquaInfo[item].tradingType === typeItem.value) {

            typeItem.disabled = true;
            }
            // item.disabled=true
        })
    }
},

数组去重

js
// 数组去重
unique(arr) {
    const res = new Map();
    return arr.filter((a) => !res.has(a) && res.set(a, 1))
},
// 数组去重
unique(arr) {
    const res = new Map();
    return arr.filter((a) => !res.has(a) && res.set(a, 1))
},

前端删除列表项

js
this.purchaseDetquaInfo = this.purchaseDetquaInfo.filter(item => {
for (let i = 0; i < this.selectionList.length; i++){
if(this.selectionList[i] === item) {
    return false
}
}

return true
})

this.clearSelections();

this.$message.success("删除成功!");
this.purchaseDetquaInfo = this.purchaseDetquaInfo.filter(item => {
for (let i = 0; i < this.selectionList.length; i++){
if(this.selectionList[i] === item) {
    return false
}
}

return true
})

this.clearSelections();

this.$message.success("删除成功!");

当一个方法执行完之后,再执行其他方法

js
arr.reduce((res, url)=> {
    return new Promise(async resolve=> {
        await getList(url);  // 等这个方法执行完之后
        resolve();
    });
}, Promise.resolve());
arr.reduce((res, url)=> {
    return new Promise(async resolve=> {
        await getList(url);  // 等这个方法执行完之后
        resolve();
    });
}, Promise.resolve());

数组中id提取出来,以逗号隔开

  1. 方法一
js
let idStr = "";

// 获取选中的id集合
for(let item in this.selectionList) {
    idStr += this.selectionList[item].id + ",";
}
// console.log(idStr);

if(idStr !== "") {
    idStr = idStr.substring(0, idStr.length-1);
}
// console.log(idStr);
let idStr = "";

// 获取选中的id集合
for(let item in this.selectionList) {
    idStr += this.selectionList[item].id + ",";
}
// console.log(idStr);

if(idStr !== "") {
    idStr = idStr.substring(0, idStr.length-1);
}
// console.log(idStr);
  1. 方法二
js
let ids = []

this.selectionList.forEach(item => {
    ids.push(item.id)
})
ids = ids.join(',')
let params = {
    ids: ids
}
console.log(params);
let ids = []

this.selectionList.forEach(item => {
    ids.push(item.id)
})
ids = ids.join(',')
let params = {
    ids: ids
}
console.log(params);

字典类写法

js
// dic
// select
const sellist = [
    {
        label: 'aa',
        value: 0,
    },
    {
        label: 'bb',
        value: 1,
    },
]

const aaa = (from, val)=> {
    let arr = [];

    for(let i=from; i<=val; i++) {
        arr.push({
            label: i,
            value: i,
        });
    }

    return arr;
}

export {
    sellist,
    aaa
}

import * as dic from '@/util/dic'  // 字典
console.log(dic.sellist);

dic.aaa(14, 30)
// dic
// select
const sellist = [
    {
        label: 'aa',
        value: 0,
    },
    {
        label: 'bb',
        value: 1,
    },
]

const aaa = (from, val)=> {
    let arr = [];

    for(let i=from; i<=val; i++) {
        arr.push({
            label: i,
            value: i,
        });
    }

    return arr;
}

export {
    sellist,
    aaa
}

import * as dic from '@/util/dic'  // 字典
console.log(dic.sellist);

dic.aaa(14, 30)

循环

js
// 循环匹配id
for(let parItem in parList) {
    // console.log(parList[parItem]);

    this.user_info.forEach(userItem=> {
        if(parItem[parItem].user_id === userItem.id) {
        // console.log(forecastList[forecastItem].user_id + "---" + userItem.id + "---" + userItem.realName);
        parItem[parItem].user_name = userItem.realName;
        }
    })
}
// 循环匹配id
for(let parItem in parList) {
    // console.log(parList[parItem]);

    this.user_info.forEach(userItem=> {
        if(parItem[parItem].user_id === userItem.id) {
        // console.log(forecastList[forecastItem].user_id + "---" + userItem.id + "---" + userItem.realName);
        parItem[parItem].user_name = userItem.realName;
        }
    })
}

Array.shift() 删除数组的第一项

js
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8];
var returnArr = arr1.shift();

console.log(arr1); // [2, 3, 4, 5, 6, 7, 8]
console.log(returnArr); // 1
var arr1 = [1, 2, 3, 4, 5, 6, 7, 8];
var returnArr = arr1.shift();

console.log(arr1); // [2, 3, 4, 5, 6, 7, 8]
console.log(returnArr); // 1

arguments 相关

js
[].slice.call( arguments )
// 等效于
Array.prototype.slice.call( arguments )

// 因为slice内部实现是使用的this代表调用对象。那么当[].slice.call() 传入 arguments对象的时候,通过 call函数改变原来 slice方法的this指向, 使其指向arguments,并对arguments进行复制操作,而后返回一个新数组。至此便是完成了arguments类数组转为数组的目的
[].shift.call( arguments )
// 删除并拿到arguments的第一项
[].slice.call( arguments )
// 等效于
Array.prototype.slice.call( arguments )

// 因为slice内部实现是使用的this代表调用对象。那么当[].slice.call() 传入 arguments对象的时候,通过 call函数改变原来 slice方法的this指向, 使其指向arguments,并对arguments进行复制操作,而后返回一个新数组。至此便是完成了arguments类数组转为数组的目的
[].shift.call( arguments )
// 删除并拿到arguments的第一项

数组去重

js
console.log(Array.from(new Set(monthArr)));
console.log(Array.from(new Set(monthArr)));

72. 去重

js
unique(arr) {
    return Array.from(new Set(arr))
},
unique(arr) {
    return Array.from(new Set(arr))
},

72. 数组根据值删除

js
Array.prototype.remove = function(val) {
    var index = this.indexOf(val);
    if (index > -1) {
        this.splice(index, 1);
    }
};
this.checkids.remove(row.ent_code)
Array.prototype.remove = function(val) {
    var index = this.indexOf(val);
    if (index > -1) {
        this.splice(index, 1);
    }
};
this.checkids.remove(row.ent_code)

77. 数组转字符串

js
setArr(arr) {
    let str = ""
    arr.forEach(item=> {
    str += item + "、"
    })

    str = str.substring(0, str.length - 1);

    return str
},
setArr(arr) {
    let str = ""
    arr.forEach(item=> {
    str += item + "、"
    })

    str = str.substring(0, str.length - 1);

    return str
},

4. if中判断条件

js
// es5
if(
    type == 1 ||
    type == 2 ||
    type == 3 ||
    type == 4 ||
){
   //...
}

// es6
// ES6中数组实例方法includes
const condition = [1,2,3,4];

if( condition.includes(type) ){
   //...
}
// es5
if(
    type == 1 ||
    type == 2 ||
    type == 3 ||
    type == 4 ||
){
   //...
}

// es6
// ES6中数组实例方法includes
const condition = [1,2,3,4];

if( condition.includes(type) ){
   //...
}

5. 列表搜索

js
// es5
// 搜索也要叫过滤,一般用filter来实现
const a = [1,2,3,4,5];
const result = a.filter( 
  item =>{
    return item === 3
  }
)

// es6
// find方法精确搜索,find方法中找到符合条件的项,就不会继续遍历数组,性能优化
const a = [1,2,3,4,5];
const result = a.find( 
  item =>{
    return item === 3
  }
)
// es5
// 搜索也要叫过滤,一般用filter来实现
const a = [1,2,3,4,5];
const result = a.filter( 
  item =>{
    return item === 3
  }
)

// es6
// find方法精确搜索,find方法中找到符合条件的项,就不会继续遍历数组,性能优化
const a = [1,2,3,4,5];
const result = a.find( 
  item =>{
    return item === 3
  }
)

6. 扁平化数组

js
// 一个部门JSON数据中,属性名是部门id,属性值是个部门成员id数组集合,现在要把有部门的成员id都提取到一个数组集合中

// es5
const deps = {
'采购部':[1,2,3],
'人事部':[5,8,12],
'行政部':[5,14,79],
'运输部':[3,64,105],
}
let member = [];
for (let item in deps){
    const value = deps[item];
    if(Array.isArray(value)){
        member = [...member,...value]
    }
}
member = [...new Set(member)]

// es6
// 涉及到数组的扁平化处理,用ES6提供的flat方法,遇到4维、5维深度的数组,得循环嵌套循环来扁平化
// flat方法不支持IE浏览器
const deps = {
    '采购部':[1,2,3],
    '人事部':[5,8,12],
    '行政部':[5,14,79],
    '运输部':[3,64,105],
}
let member = Object.values(deps).flat(Infinity);
// 一个部门JSON数据中,属性名是部门id,属性值是个部门成员id数组集合,现在要把有部门的成员id都提取到一个数组集合中

// es5
const deps = {
'采购部':[1,2,3],
'人事部':[5,8,12],
'行政部':[5,14,79],
'运输部':[3,64,105],
}
let member = [];
for (let item in deps){
    const value = deps[item];
    if(Array.isArray(value)){
        member = [...member,...value]
    }
}
member = [...new Set(member)]

// es6
// 涉及到数组的扁平化处理,用ES6提供的flat方法,遇到4维、5维深度的数组,得循环嵌套循环来扁平化
// flat方法不支持IE浏览器
const deps = {
    '采购部':[1,2,3],
    '人事部':[5,8,12],
    '行政部':[5,14,79],
    '运输部':[3,64,105],
}
let member = Object.values(deps).flat(Infinity);

every()和 some()的对比

  • 相同点

    • every()和 some()这两个函数都是在 JS 中对数组进行迭代操作的,主要用于检查数组中所有元素是否都符合指定函数的测试,而且要检测数组中的所有元素。
  • 不同点

    • every()是检测数组中所有元素都满足某一个指定函数的测试,只有所有元素全部满足才会返回 true,类似&&;some()是检测数组中所有元素只要有某个元素满足就返回 true,如果全部不满足才返回 false,类似||。
    • some()是一直在数组中寻找符合条件的元素值,如果数组中包含符合条件的值并且被立马找到,就直接返回 true,剩下的元素不会再去查找,也就是说不会继续迭代下去;every()是从开始在数组中查找符合条件的元素值,数组中只要有一个元素不符合条件的元素值,就直接返回 false,剩下的元素也不会再去查找,不会继续迭代下去。

    js 数组中的 include 方法

js
if ([1, 2, 3].includes(type)) {
  // code
}
if ([1, 2, 3].includes(type)) {
  // code
}

数组的链式操作

  • 判断数组中是否包含另一个对象数组中的数据,有的话,过滤出来
  • 将过滤出来的数组组装成只有名称的数组
  • 将只有名称的数组转换成字符串,并用逗号分隔
js
groupTypesOptions()
        .filter((item) => scope.row.groupTypes.includes(item.value))
        .map((item) => item.label)
        .join(','),
groupTypesOptions()
        .filter((item) => scope.row.groupTypes.includes(item.value))
        .map((item) => item.label)
        .join(','),

map转对象数组

js
export function mapToOptions(map) {
  let arr = Array.from(map).map((item) => {
    return {
      label: item[1],
      value: item[0]
    }
  })

  return [
    {
      label: '全部',
      value: ''
    },
    ...arr
  ]
}
export function mapToOptions(map) {
  let arr = Array.from(map).map((item) => {
    return {
      label: item[1],
      value: item[0]
    }
  })

  return [
    {
      label: '全部',
      value: ''
    },
    ...arr
  ]
}

reduce用法

  • reduce 函数的基本语法为:array.reduce(callbackfn, initialValue)。
  • callbackfn 是回调函数,它接受四个参数:前一个值(prev)、当前值(current)、当前索引(index)和数组本身(array)
  • initialValue 是初始值,可选参数。
js
let arr = [
  { count: 10, num: 3, name: '张三' },
  { count: 2, num: 22, name: '李四' },
  { count: 13, num: 5, name: '王五' },
  { count: 56, num: 4, name: '朱六' },
  { count: 33, num: 12, name: '赵二' }
];
let res = arr.reduce((prev, next) => prev + next.count * next.num, 0);
console.log(res); // 759

/**
 * 在这个例子里,reduce 函数对数组arr中的每个元素执行count和num相乘,然后将乘积加到前一个值prev中。由于初始值为 0,因此当遍历数组的第一个元素时,prev 的初始值为 0,next.count * next.num 的值为 30,这两个值相加得到 30。接下来,prev 的值变为 30,next.count * next.num 的值为 44,这两个值相加得到 74。以此类推,直到遍历完整个数组,得到最终的结果 759。
 */
let arr = [
  { count: 10, num: 3, name: '张三' },
  { count: 2, num: 22, name: '李四' },
  { count: 13, num: 5, name: '王五' },
  { count: 56, num: 4, name: '朱六' },
  { count: 33, num: 12, name: '赵二' }
];
let res = arr.reduce((prev, next) => prev + next.count * next.num, 0);
console.log(res); // 759

/**
 * 在这个例子里,reduce 函数对数组arr中的每个元素执行count和num相乘,然后将乘积加到前一个值prev中。由于初始值为 0,因此当遍历数组的第一个元素时,prev 的初始值为 0,next.count * next.num 的值为 30,这两个值相加得到 30。接下来,prev 的值变为 30,next.count * next.num 的值为 44,这两个值相加得到 74。以此类推,直到遍历完整个数组,得到最终的结果 759。
 */
js
let keys = ['name', 'age'];
let values = ['张三', 18];
let res = keys.reduce((prev, next, index, arr) => (prev[next] = values[index], prev), {});
console.log(res); // {name: '张三', age: 18}

/**
 * 这段代码的作用是将两个数组keys和values合并成一个对象。在reduce方法中,prev 参数的初始值为一个空对象 {},然后将keys数组中的每个元素依次作为next参数传入回调函数。在回调函数中,通过prev[next] = values[index]将prev中对应的属性值设置为values数组中对应的元素值,最后返回prev对象。由于reduce方法会遍历整个keys数组,因此最终得到的对象包含了keys数组中的所有元素和它们对应的values数组中的元素。最终输出结果为 {name: '张三', age: 18}。
 */
let keys = ['name', 'age'];
let values = ['张三', 18];
let res = keys.reduce((prev, next, index, arr) => (prev[next] = values[index], prev), {});
console.log(res); // {name: '张三', age: 18}

/**
 * 这段代码的作用是将两个数组keys和values合并成一个对象。在reduce方法中,prev 参数的初始值为一个空对象 {},然后将keys数组中的每个元素依次作为next参数传入回调函数。在回调函数中,通过prev[next] = values[index]将prev中对应的属性值设置为values数组中对应的元素值,最后返回prev对象。由于reduce方法会遍历整个keys数组,因此最终得到的对象包含了keys数组中的所有元素和它们对应的values数组中的元素。最终输出结果为 {name: '张三', age: 18}。
 */

根据数组的值删除某一项

js
menuMethods = menuMethods.filter(function (item) {
return item !== "xxxxxx"
});
menuMethods = menuMethods.filter(function (item) {
return item !== "xxxxxx"
});