You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES6对象比较方法及Angular Material复选框匹配勾选实现

在ES6中比较对象/对象数组并自动勾选Angular Material复选框

我来帮你解决这两个问题——ES6对象/数组比较,以及Angular Material复选框的自动勾选:

一、ES6中对象的比较

ES6没有内置的对象深度比较函数,我们需要根据需求实现浅比较或深比较:

1. 浅比较(仅比较第一层属性值)

如果你的对象没有嵌套结构,或者只需要比较第一层属性,可以用这个方法:

function isShallowEqual(objA, objB) {
  // 先判断是否是同一个引用
  if (Object.is(objA, objB)) return true;
  
  // 排除非对象/null的情况
  if (typeof objA !== 'object' || objA === null || 
      typeof objB !== 'object' || objB === null) {
    return false;
  }
  
  // 对比属性数量
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);
  if (keysA.length !== keysB.length) return false;
  
  // 逐个对比属性值
  for (const key of keysA) {
    if (!objB.hasOwnProperty(key) || !Object.is(objA[key], objB[key])) {
      return false;
    }
  }
  return true;
}
  • Object.is()用来精准比较值(比如区分+0和-0,NaN等于自身),比===更严谨。

2. 深比较(支持嵌套对象)

如果对象有多层嵌套,需要递归对比:

function isDeepEqual(objA, objB) {
  if (Object.is(objA, objB)) return true;
  
  if (typeof objA !== 'object' || objA === null || 
      typeof objB !== 'object' || objB === null) {
    return false;
  }
  
  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);
  if (keysA.length !== keysB.length) return false;
  
  for (const key of keysA) {
    if (!objB.hasOwnProperty(key) || !isDeepEqual(objA[key], objB[key])) {
      return false;
    }
  }
  return true;
}

二、对象数组比较+Angular Material复选框自动勾选

结合你的示例,我们需要把arr1(对应模板里的groups)和arr2中匹配的对象对应的复选框勾选。最优方案是提前在组件中预处理匹配状态,避免模板里写复杂逻辑:

步骤1:组件中预处理匹配标记

// app.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.html'
})
export class AppComponent {
  groups = [ { "id":"1", "name":"operator" }, { "id":"2", "name":"admins" } ];
  arr2 = [ { "id":"1", "name":"operator" }, { "id":"3", "name":"client" } ];
  // 用Set存储arr2中存在的id,快速判断匹配
  matchedIds = new Set(this.arr2.map(item => item.id));

  // 如果需要完整对象匹配(而非仅id),可以这样处理:
  // matchedItems = new Set(this.arr2.map(item => JSON.stringify(item)));
  // groupsWithCheck = this.groups.map(group => ({
  //   ...group,
  //   isChecked: this.matchedItems.has(JSON.stringify(group))
  // }));

  assignGroups(event: any, groupId: string) {
    // 你的勾选变更逻辑
    console.log(`Group ${groupId} checked: ${event.checked}`);
  }
}

步骤2:模板中绑定勾选状态

修改[checked]属性,根据预处理的匹配结果判断:

<!-- app.html -->
<div class="col" *ngFor="let group of groups; let i = index"> 
  <mat-checkbox 
    [value]="group.id" 
    labelPosition="after" 
    [checked]="matchedIds.has(group.id)" 
    (change)="assignGroups($event, group.id)"
  > 
    {{ group.name }} 
  </mat-checkbox> 
</div>

为什么不用你原来的forEach+some?

你原来的代码只是打印了匹配的对象,但没有把匹配状态存储下来供模板使用。用Set存储匹配的id,has()方法的查询效率是O(1),比每次在模板里调用arr2.some(...)(O(n))更高效,尤其是数组元素较多时。

如果需要完整对象匹配(比如id和name都要一致),可以用上面注释里的方法——把对象序列化为字符串存入Set,或者用前面写的isShallowEqual函数来判断,然后给每个group添加isChecked属性,模板直接绑定[checked]="group.isChecked"即可。

内容的提问来源于stack exchange,提问作者SKL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:16:15