Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Phương thức _isEqual() trong Underscore/Lodash: So sánh object sâu

_.isEqual(obj1, obj2) so sánh deep equality — kiểm tra đệ quy giá trị của mọi property, không quan tâm thứ tự property. Khác với JSON.stringify() so sánh chuỗi (phụ thuộc thứ tự key).

Cú pháp

_.isEqual(object1, object2); // true / false

Ví dụ: Thứ tự property khác nhau

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
  const obj1 = { name: 'Sikha', designation: 'Content Developer' };
  const obj2 = { designation: 'Content Developer', name: 'Sikha' }; // Thứ tự khác
  
  document.write(_.isEqual(obj1, obj2) + '<br>'); // true
  document.write(JSON.stringify(obj1) === JSON.stringify(obj2) + '<br>'); // false
</script>

Kết quả

true
false

So sánh Deep Equality: _.isEqual vs JSON.stringify vs ===

Phương phápDeep?Thứ tự keyFunction/SymbolCircular refHiệu suất
===Không (reference)N/AReferenceN/ANhanh nhất
JSON.stringifyCó (shallow serialize)Phụ thuộcMất (skip)Lỗi (throw)Trung bình
_.isEqualCó (deep)Không phụ thuộcSo sánh referenceHỗ trợ (detect circular)Chậm hơn

Các trường hợp _.isEqual xử lý tốt

  • Nested object/array.
  • Date object (so sánh timestamp).
  • RegExp (so sánh pattern + flags).
  • TypedArray, ArrayBuffer.
  • Map, Set (so sánh size + entries).
  • Circular reference (không stack overflow).

Ví dụ Date và RegExp

_.isEqual(new Date('2024-01-01'), new Date('2024-01-01')); // true
_.isEqual(/abc/gi, /abc/gi); // true
_.isEqual(/abc/i, /abc/g);   // false (flags khác)

Native Alternative: Custom Deep Equal

function deepEqual(a, b) {
  if (a === b) return true;
  if (a == null || b == null || typeof a !== 'object' || typeof b !== 'object') return false;
  
  const keysA = Object.keys(a), keysB = Object.keys(b);
  if (keysA.length !== keysB.length) return false;
  
  for (let key of keysA) {
    if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false;
  }
  return true;
}
// Không handle: Date, RegExp, Map, Set, Circular, Symbol keys

Khi nào dùng _.isEqual?

  • So sánh state trong React/Redux (shouldComponentUpdate, selector memoization).
  • Test assertion (Jest toEqual dùng deep equal tương tự).
  • Dedup object trong mảng.
  • Cache key từ object phức tạp.