JavaScript数组、对象处理方法

一、数组处理

1. 数组深层复制

const finalArr = [];   
finaArr = checkArr;

数组是一种引用数据类型,直接给对象赋值,是引用赋值,引用的是内存里的地址,两个数组指向的是同一个内存地址,会同时改变。

解决方法:

(1)解构赋值,解构出来的是一个新的数组,不会指向原来的地址

finalArr = [...checkArr]; (2) 数组深层拷贝

实现对象的深拷贝(利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象)

let b = JSON.parse(JSON.stringify(a))

2、数组比较

  1. 两个数组永远不相等,数组是引用地址,要判断两个数组相等
arr1.toString() == arr2.toString()
JSON.stringify(arr1) == JSON.stringify(arr2)

3. includes 方法

(1)多个并行的判断条件,可以用includes函数,简化代码逻辑

if (["今日实时", "汇总统计", "下载汇总报表"].includes(subItem.name)) {
  item.children.splice(subIndex, 1);
}

4. 去除数组中的相同元素

indexOf只返回元素在数组中第一次出现的位置,如果与元素位置不一致,说明该元素在前面已经出现过,是重复元素,会被filter过滤掉

  const editPlainOptions = arr.filter((e, index, item) => 
     return item.indexOf(e) === index;
  });

5. 数组排序 - sort 函数

1. 字母开头默认按升序排序,不需要出入参数

['a','c', 'b' ].sort(); // a,b,c

2. 使用数字排序,你必须通过一个函数作为参数来调用

(1)arr.sort(), 如果排序函数返回值是大于0 的数,sort函数将数组降叙排序

(2)rr.sort(), 如果排序函数返回值是小于0 的数,sort函数将数组升序排序

[1,23,4 ].sort(function(a, b) {
  return a - b;  // 第一项 减去第二项,如果小于 0,就将第一项放到前面,升序排序(a - b)
[1,23,4 ].sort(function(a, b) {
  return b - a;  // 第二项 减去第一项,如果小于 0,就将第二项放到前面,降序排序(b - a)
})

6.map函数和forEach

  1. 在使用map函数时多层map循环需要多层return

2. foreach和map函数的区别 -- map函数有返回值,forEach函数没有

3. 在forEach函数或者map函数中, return 跳出整个函数,和层级结构没有关系

二、对象处理

1. 批量处理对象里的数据

for(key in  value ) { if(!value[key]) {  delete value[key] } }

2. 对象比较

equals和==的区别

(1) equals检测两个对象是否相等

(2)== 比较基本数据类型和比较引用类型

3. 获取对象的属性值不为空的属性的个数

getNumber(obj) {
  let count = 0;
  for(var i in obj) {
    if(obj.hasOwnProperty(i) && obj[i] != '') { 
      count ++;
  return count;
 }

4. 给对象赋动态的属性值

obj[type] = value;

5. object.assgin

 object.assgin({}, obj ,arr ) =>   合成一个对象 ,越是后面的参数占比越高,后面的对象的属性值会覆盖前面的同名的属性值

6. 排序问题

1. map数据和object对象的排序问题

Map实例对象的key值可以为一个数组或者一个对象,或者一个函数,比较随意,而且 Map对象实例中数据的排序是根据用户push的顺序进行排序的,而Object实例中key,value的顺序则有些规律(它们会先排数字开头的值,然后才是字符串开头的key值);

7. 判断一个Map数据为空

首先设置一个标志位,并将值设置为true,然后循环遍历这个map,如果进入循环,则说明map非空,在循环中把标志位设置为false,具体代码如下
 dealData = (data) => {
    let isEmpty = true;
    for (const name in data) {  //name是自定义得一个变量,与data中本身得数据无关
      isEmpty = false;
    if (!isEmpty) {
      // 解析map数据
      const list = [];
      const finalList = [];
      for (var i in data) {
        const obj = {};
        obj.dt = i;
        for (var key in data[i]) { //map key
          obj.itemList = data[i];