判断对象数组是否包含某个对象

let a = {num:1},
    b = {num:1},
    c = a;
console.log(a == b)  => false
console.log(b == c)  => false
console.log(a == c)  => true

给不同变量a,b赋值 键值对一样的{num:1},a,b变量不相等,他们的指针不一样;

c = a, c 赋值了 a ,这时 c 与 a 的指针相等,所以打印 a == c 时,结果是true;

判断数组是否包含某个对象的方法

let arr = [
    {num:1},
    {num:2},
    {num:3}
],
    jsonA = {num:1},  // {num:1}
    jsonB = arr[0],   // {num:1}
    jsonC = {num:5};  // {num:5}
console.log(arr.includes(jsonA))  => false
console.log(arr.includes(jsonB))  => true
console.log(arr.includes(jsonC))  => false


jsonB 是 arr 的第 0 下标的值,和 arr 有赋值关系,所以 arr.includes(jsonB)的结果是 true;

jsonA 直接赋值 {num:1} , 是一个新的对象, 和 arr 没有赋值关系,所以 arr.includes(jsonA) 的结果是 false。

一、JSON.stringify + indexOf

  • 解决方法A:把 arr 和 jsonA 变成字符串,通过 indexOf 判断下标是否 -1

    JSON.stringify(arr).indexOf(JSON.stringify(jsonA))
    
    console.log(JSON.stringify(arr).indexOf(JSON.stringify(jsonA)))  // 打印 1 ,包含
    console.log(JSON.stringify(arr).indexOf(JSON.stringify(jsonC)))  // 打印 -1 ,不包含
    

二、存在赋值关系,includesindexOf

  • 解决方法B:如果 数组 和 对象 存在赋值关系,直接使用 includesindexOf 判断:

    arr.includes(jsonB); //  true 包含
    arr.indexOf(jsonB); //  0 包含
    
    let jsonD = arr[6];  // undefined
    arr.includes(jsonD)  // false  arr的下标一共只有 0, 1, 2, 没有6,所以不包含,jsonD是undefined,不存在于 arr 里。
    arr.indexOf(jsonD)  // -1
    

三、通过对象的唯一键值对(比如id)去判断

  • 解决方法C:封装方法,通过查找数组arr中,是否存在 该对象 jsonA 中的唯一value值的某个键值对判断:

    function findItem(arr,key,val) {
        for(let i = 0; i < arr.length; i++) {
            if(arr[i][key] == val) {
                return i
            }
        }
        return -1
    }
    
    
    • 使用方法
    let dataArr = [
      {
        num:"0",
        id: "8aaee7f3715e1962017161a9272d1b07",
        sortNum: null,
        isDisable: "N",
        createTime: "2020-04-10 09:16:47",
        createBy: "13033333333.小型",
        userName:"大东"
      },
      {
        num:"1",
        id: "8aaee7f3713a3b1001713f76e2c73173",
        sortNum: null,
        isDisable: "N",
        createTime: "2020-04-03 17:54:48",
        createBy: "13733333333.13733333333",
        userName:"大喜"
      },
      {
        num:"2",
        id: "8aaee7f3713a3b1001713f76e2c33621",
        sortNum: null,
        isDisable: "N",
        createTime: "2020-04-03 18:00:00",
        createBy: "13733333344.13733333344",
        userName:"大东"
      },
    ];
    let item = {
        num:"2",
        id: "8aaee7f3713a3b1001713f76e2c33621",
        sortNum: null,
        isDisable: "N",
        createTime: "2020-04-03 18:00:00",
        createBy: "13733333344.13733333344",
        userName:"大东"
      }
    
    let index = findItem(dataArr,'id',item.id);
    console.log(index)  // 2
    
  • 解决方法D:修改 C 的方法,可查找整个对象:

    function findObj(arr,obj) {
        for(let i = 0; i < arr.length; i++) {
            if(JSON.stringify(arr[i]) == JSON.stringify(obj)) {
                return i
            }
        }
        return -1
    }
    

    使用方法:

    let idx = findObj(dataArr,item);
    console.log(idx)  // 2
    

JSON.stringify()的开销较大,数据量大的话避免使用,性能不佳

如果 Array 或 Object 里面含有 Function, 不能使用JSON.stringify 将其转化为字符串

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐