JS中数组与对象常使用的方法

80 阅读5分钟

0、引言

这周在工作中,遇到了许多数据转换的问题,主要为数组和对象,因此,在这篇文章中总结了一些常用的数组与对象方法

1、数组相关

  1. 数组转换字符串:toString()、toLocaleString()、join(*),最后一个可以制定转换为字符串时的分隔符
  2. 尾部操作:弹出尾部元素pop()、尾部添加元素push(a)
  3. 首部操作:删除首部shift()、首部插入unshift(a)
  4. 重排序:反转数组reverse()、默认从小到大sort()
let a = [1, 2, 3, 4, 5, 0.1]

a.sort(function (a, b){ return b - a })  //[ 5, 4, 3, 2, 1, 0.1 ] 降序
a.sort(function (a, b){ return a - b })  //[ 0.1, 1, 2, 3, 4, 5 ] 升序

const arr = [3, NaN, 2, 'a'];
console.log(arr.sort((a, b) => a - b)); //  [3, NaN, 2, 'a']

但是sort方法使用过程中需要注意以下几点:

  • 默认排序基于字符串字典顺序,数值排序必须提供比较函数,比较函数如上方代码所示
  • 排序会修改原数组,保留原数组需先复制
  • 对于复杂数据,确保比较函数正确处理边界情况(如 NaN 和本地化排序)
  1. 数组连接concat()
let a = [1, 2, 3, 4, 5]
let b = [6, 7, 8, 9, 10]

let c = a.concat(b)
console.log(c);  // [1, 2, 3, 4, 5 , 6, 7, 8, 9, 10]
  • 不修改原数组,会返回一个新数组,适合需要保持原数组不变的场景
  • 使用扩展运算符也可以实现类似的效果
  1. 数组截取:slice()
let a = [1, 2, 3, 4, 5]

console.log(a.slice(2));  // 从下标为2开始 [ 3, 4, 5 ]
console.log(a.slice(2,4));  // 左闭右开 [ 3, 4 ]
console.log(a.slice(1,5));  // 超出范围 [ 2, 3, 4, 5 ]
console.log(a.slice(-2));  // 倒数两个 [ 4, 5 ]
console.log(a.slice(2,-1));  // 取两个,从倒数第二个位置开始 [ 4, 5 ]
console.log(a.slice());  // 全部读取

const arr = [{ a: 1 }, { b: 2 }];
const result = arr.slice(0, 1);
result[0].a = 99;
console.log(arr[0].a); // 99 (共享引用)

  • 不仅适用于数组,也适用于字符串,并且不改变原数据
  • 对于原始类型(如数字、字符串),拷贝的值是独立的,对于引用类型,拷贝则是引用
  1. 数组插入&&删除&&替换:splice(startIndex, deleteCount, item1, item2, ...)
const array = [1, 2, 3, 4, 5];

arr.splice(2)  // 截取2个
console.log(arr);  // [1,2]

array.splice(2, 1); // 从索引 2 开始删除 1 个元素
console.log(array); // 输出: [1, 2, 4, 5]

array.splice(2, 0, 6); // 在索引 2 处插入元素 6,不删除任何元素
console.log(array); // 输出: [1, 2, 6, 3, 4, 5]

array.splice(2, 1, 6); // 从索引 2 处删除 1 个元素,并插入元素 6
console.log(array); // 输出: [1, 2, 6, 4, 5]

array.splice(1, 2, 6, 7, 8); // 从索引 1 处删除 2 个元素,并插入元素 6, 7, 8
console.log(array); // 输出: [1, 6, 7, 8, 4, 5]

array.splice(1, 3); // 从索引 1 处删除 3 个元素
console.log(array); // 输出: [1, 5]

array.splice(array.length, 0, 4); // 在数组末尾插入元素 4
console.log(array); // 输出: [1, 2, 3, 4]
  • 会修改原数组
  1. 数组检测方法
// indexOf()方法
console.log(arr.indexOf(1));  //数组中有该元素,返回0,否则返回-1

// every()方法
console.log(arr.every(e => e > 0));  //true 数组中所有元素满足条件返回true,否则返回false

// some()方法
//用于检查数组中是否至少有一个元素满足指定的条件。这个方法会遍历数组的每个元素,直到找到一个满足条件的元素,如果找到了就返回 true,否则返回 false
console.log(arr.some(e => e % 2 == 0));  // true

// find()方法
// 用于查找数组中满足指定条件的第一个元素,并返回该元素,没有满足条件的返回underfined
console.log(arr.find(e) => e > 3) // 4
  1. 数组过滤方法
// for循环
for (let index = 0; index < array.length; index++) {
   const element = array[index];
}

// filter()方法
// 用于创建一个新数组,其中包含满足指定条件的原数组元素
console.log(arr.filter(e => e > 3));  //[ 4, 5 ]

// map()方法
// 用于创建一个新数组,该数组的元素是原始数组经过某个函数处理后的结果
console.log(arr.map(e => e * 2));  // [ 2, 4, 6, 8, 10 ]

// forEach()方法
// 用于遍历数组的每个元素,并对每个元素执行指定的操作
arr.forEach(function (e, index){
    console.log(e);
});  //1 2 3 4 5

// for...of
const arr = [10, 20, 30]; 
for (const value of arr) {
  console.log(value); // 输出: 10, 20, 30 
}

2、对象相关

  1. Object.keys():返回一个包含对象所有可枚举属性名称(键)的数组
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
  1. Object.values():返回一个包含对象所有可枚举属性值的数组
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.values(obj)); // [1, 2, 3]
  1. Object.entries():返回一个包含对象所有可枚举属性 [key, value] 对的数组
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]
  1. Object.freeze()
const obj = { a: 1 };
Object.freeze(obj);
obj.a = 2; // 不会生效
console.log(obj.a); // 1
  1. for...in:遍历对象的所有可枚举属性
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
   console.log(key, obj[key]);  // 输出属性名和对应的值
}

3、for...in与for...of

  • for...of在ES6中提出,主要用于遍历数组、字符串、MapSet 等可迭代对象的 ,而不是对象的键或数组的索引。
  • for...in主要用于遍历对象的键(或数组的索引)

在使用中,建议使用for...of来进行相关的数组遍历,他在遍历过程中,不会遍历继承而来的属性,所以比较准确,并且在遍历过程中,会按照相关的顺序进行遍历;而for...of会便利继承的属性并且顺序也不固定,可能会导致出现意外的结果