AngularJS/JavaScript中无主键数组去重的对比实现方法
解决AngularJS无主键数组的去重问题
这个场景太常见了——当数据没有唯一ID这类主键时,就得靠字段组合或者完整对象对比来避免重复。下面给你几种实用的实现方式,覆盖原生JS和AngularJS的专属方案:
方法1:指定多个核心字段判断重复
如果你确定某2-3个字段组合起来就能唯一标识一条数据(比如matchName、address、country),可以写个简单的对比函数,再结合数组的some方法检查是否已存在:
// 自定义判断重复的函数,这里选3个核心字段 function isDuplicate(existingItem, newItem) { return existingItem.matchName === newItem.matchName && existingItem.address === newItem.address && existingItem.country === newItem.country; } // 遍历新数组,把不重复的元素加入原数组 $scope.unassociatedResultsNewArray.forEach(newItem => { const itemExists = $scope.unassociatedResults.some(item => isDuplicate(item, newItem)); if (!itemExists) { $scope.unassociatedResults.push(newItem); } });
这种方法的好处是灵活,你可以根据业务需求调整要对比的字段,而且性能比全对象对比好,因为只检查几个字段。
方法2:原生JS对比完整对象
如果需要严格匹配整个对象的所有属性(包括所有字段都完全一致才视为重复),可以用JSON.stringify把对象转成字符串后对比——不过要注意,这种方法依赖对象的属性顺序,如果两个对象内容相同但属性顺序不一样,会被误判为不同:
function isFullDuplicate(existingItem, newItem) { return JSON.stringify(existingItem) === JSON.stringify(newItem); } // 同样的添加逻辑 $scope.unassociatedResultsNewArray.forEach(newItem => { const itemExists = $scope.unassociatedResults.some(item => isFullDuplicate(item, newItem)); if (!itemExists) { $scope.unassociatedResults.push(newItem); } });
如果你的数据结构属性顺序是固定的,这个方法简单好用;如果属性顺序可能变化,就不建议用这个了。
方法3:用AngularJS内置的深度对比工具
AngularJS自带了angular.equals方法,它会深度递归对比两个对象/值,能正确处理属性顺序、日期对象、数组等各种情况,比自己写对比逻辑靠谱得多:
// 直接用angular.equals做深度对比 $scope.unassociatedResultsNewArray.forEach(newItem => { const itemExists = $scope.unassociatedResults.some(item => angular.equals(item, newItem)); if (!itemExists) { $scope.unassociatedResults.push(newItem); } });
这个方法是最省心的,毕竟是框架原生提供的,专门处理这类对象对比场景,不用自己操心各种边界情况。
内容的提问来源于stack exchange,提问作者angular newpiee
相关产品推荐
相关产品推荐

