Hướng dẫn compare 2 object javascript - so sánh 2 đối tượng javascript

Đối tượng là các loại tham chiếu để bạn có thể chỉ sử dụng === hoặc == để so sánh 2 đối tượng. Một cách nhanh chóng để so sánh nếu 2 đối tượng có cùng giá trị khóa, là sử dụng JSON.stringify. Một cách khác là sử dụng chức năng lodash

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
0

Show

# So sánh sâu thẳm

Yup, 2 cách cũng hoạt động cho các vật thể lồng sâu.

# Tôi nên sử dụng cái nào?

Điều đó phụ thuộc. Đối với

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
1, vấn đề đặt hàng. Vì vậy, nếu cặp giá trị khóa được đặt hàng khác nhau trong hai đối tượng nhưng giống nhau, nó sẽ trả về sai. Trong khi nó không quan trọng trong Lodash
// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
0, nó sẽ trả về đúng khi cặp giá trị khóa tồn tại.

Đây là đề xuất của tôi. Đối với một giải pháp nhanh chóng và bẩn, tôi sẽ sử dụng

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
1. Nhưng đối với một giải pháp mạnh mẽ hơn bao gồm nhiều trường hợp cạnh kỳ lạ hơn, hãy sử dụng Lodash Way.

# Es6 cách để so sánh 2 đối tượng

Đây là một giải pháp được đề xuất bởi @mustafauzun0. Mặc dù vậy, rất ít điều cần lưu ý, nó đã giành được công việc với các đối tượng lồng nhau và thứ tự của các phím rất quan trọng. Ý tưởng đằng sau điều này tương tự như cách chuỗi. Nó bao phủ đối tượng thành một chuỗi và so sánh nếu các chuỗi là một kết quả phù hợp. Về cơ bản nó so sánh sự bình đẳng của hai chuỗi. Đó là lý do tại sao đơn đặt hàng quan trọng.

Cảm ơn: @mustafauzun0

# Json.Stringify vs hiệu suất của Lodash

Cole Turner: Đáng chú ý rằng các đối tượng không đảm bảo thứ tự sắp xếp và Stringify sẽ tốn nhiều hiệu suất hơn vì nó phải tuần tự hóa toàn bộ đối tượng trong khi Lodash có thể thoát ra sớm nếu tìm thấy một khóa không khớp. Điều này xuất hiện trong các cuộc phỏng vấn 🙂

Cảm ơn: @Coleturner

BLNKDOTSPACE: Lodash nhanh hơn đáng kể. Bởi vì Lodash sẽ bỏ cuộc ngay khi nó đạt đến sự khác biệt đầu tiên, nhưng Stringify đi ngay cho đến khi kết thúc một cách không cần thiết. Nếu bạn có các mảng nhỏ thì không sao nhưng đối với các trường hợp sử dụng cá nhân của tôi với hơn 1000 sự kiện/sản phẩm trong danh sách, tôi sẽ không bao giờ sử dụng Stringify.

Cảm ơn: @blnkdotspace

# Tài nguyên

  • MDN Web Docs - JSON.Stringify
  • Lodash: Isequal
  • Hiểu các đối tượng JavaScript
  • Bình đẳng đối tượng trong JavaScript
  • JavaScript so sánh đối tượng sâu - JSON.
  • Stack Overflow: Có tốt không khi sử dụng JSON.Stringify để so sánh sâu và nhân bản?
  • Làm thế nào để xác định bình đẳng cho hai đối tượng JavaScript?

Nếu bạn đang sử dụng UnderCoreJS thì bạn chỉ cần sử dụng hàm _.isequal và nó so sánh tất cả các khóa và giá trị ở mỗi cấp độ phân cấp như ví dụ dưới đây.

Nội dung chính ShowShow

  • # So sánh sâu thẳm
  • # Tôi nên sử dụng cái nào?
  • # Es6 cách để so sánh 2 đối tượng
  • # Json.Stringify vs hiệu suất của Lodash
  • # Tài nguyên
  • Mã giải thích:
  • Ví dụ Dữ liệu & Kết quả
  • Mã để nhận được nhiều khóa cập nhật
  • Ví dụ cho nhiều khóa cập nhật
  • Tôi có thể so sánh hai đối tượng trong JavaScript không?
  • Làm thế nào để bạn biết nếu hai đối tượng có cùng một khóa?
  • Làm thế nào để bạn so sánh hai giá trị của các đối tượng?
  • Bạn có thể sử dụng == để so sánh các đối tượng không?

var object = {"status":"inserted","id":"5799acb792b0525e05ba074c","data":{"workout":[{"set":[{"setNo":1,"exercises":[{"name":"hjkh","type":"Reps","category":"Cardio","set":{"reps":5}}],"isLastSet":false,"index":0,"isStart":true,"startDuration":1469689001989,"isEnd":true,"endDuration":1469689003323,"speed":"00:00:01"}],"setType":"Set","isSuper":false,"index":0}],"time":"2016-07-28T06:56:52.800Z"}};

var object1 = {"status":"inserted","id":"5799acb792b0525e05ba074c","data":{"workout":[{"set":[{"setNo":1,"exercises":[{"name":"hjkh","type":"Reps","category":"Cardio","set":{"reps":5}}],"isLastSet":false,"index":0,"isStart":true,"startDuration":1469689001989,"isEnd":true,"endDuration":1469689003323,"speed":"00:00:01"}],"setType":"Set","isSuper":false,"index":0}],"time":"2016-07-28T06:56:52.800Z"}};

console.log(_.isEqual(object, object1));//return true

Nếu tất cả các khóa và giá trị cho các khóa đó giống nhau trong cả hai đối tượng thì nó sẽ trả về đúng, nếu không thì hãy trả về sai.

Đối tượng là các loại tham chiếu để bạn có thể chỉ sử dụng === hoặc == để so sánh 2 đối tượng. Một cách nhanh chóng để so sánh nếu 2 đối tượng có cùng giá trị khóa, là sử dụng JSON.stringify. Một cách khác là sử dụng chức năng lodash

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
0

# So sánh sâu thẳm

# Tôi nên sử dụng cái nào?

# Tôi nên sử dụng cái nào?

# Es6 cách để so sánh 2 đối tượng

# Json.Stringify vs hiệu suất của Lodash

# Es6 cách để so sánh 2 đối tượng

# Json.Stringify vs hiệu suất của Lodash

# Tài nguyên

# Json.Stringify vs hiệu suất của Lodash

# Tài nguyên

Mã giải thích:

Ví dụ Dữ liệu & Kết quả

Mã để nhận được nhiều khóa cập nhật

# Tài nguyên

  • Mã giải thích:
  • Ví dụ Dữ liệu & Kết quả
  • Mã để nhận được nhiều khóa cập nhật
  • Ví dụ cho nhiều khóa cập nhật
  • Tôi có thể so sánh hai đối tượng trong JavaScript không?
  • Làm thế nào để bạn biết nếu hai đối tượng có cùng một khóa?
  • Làm thế nào để bạn so sánh hai giá trị của các đối tượng?

Nếu tất cả các khóa và giá trị cho các khóa đó giống nhau trong cả hai đối tượng thì nó sẽ trả về đúng, nếu không thì hãy trả về sai.

Đối tượng là các loại tham chiếu để bạn có thể chỉ sử dụng === hoặc == để so sánh 2 đối tượng. Một cách nhanh chóng để so sánh nếu 2 đối tượng có cùng giá trị khóa, là sử dụng JSON.stringify. Một cách khác là sử dụng chức năng lodash

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
0

Yup, 2 cách cũng hoạt động cho các vật thể lồng sâu.

Điều đó phụ thuộc. Đối với // es module import { isEqual, uniq } from "lodash"; // OR commonJS const _ = require("lodash"); const { isEqual, uniq } = _; const getUpdatedKey = (oldData, newData) => { const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]); for(const key of data){ if(!isEqual(oldData[key], newData[key])){ return key; } } return null; } 1, vấn đề đặt hàng. Vì vậy, nếu cặp giá trị khóa được đặt hàng khác nhau trong hai đối tượng nhưng giống nhau, nó sẽ trả về sai. Trong khi nó không quan trọng trong lodash // es module import { isEqual, uniq } from "lodash"; // OR commonJS const _ = require("lodash"); const { isEqual, uniq } = _; const getUpdatedKey = (oldData, newData) => { const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]); for(const key of data){ if(!isEqual(oldData[key], newData[key])){ return key; } } return null; } 0, nó sẽ trả về đúng khi cặp giá trị khóa tồn tại.

Đây là đề xuất của tôi. Đối với một giải pháp nhanh chóng và bẩn thỉu, tôi sẽ sử dụng

// es module
import { isEqual, uniq } from "lodash";

// OR commonJS
const _ = require("lodash");
const { isEqual, uniq } = _;

const getUpdatedKey = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);

  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      return key;
    }
  }

  return null;
}
1. Nhưng đối với một giải pháp mạnh mẽ hơn bao gồm nhiều trường hợp cạnh kỳ lạ hơn, hãy sử dụng Lodash Way.

Đây là một giải pháp được đề xuất bởi @mustafauzun0. Mặc dù vậy, rất ít điều cần lưu ý, nó đã giành được công việc với các đối tượng lồng nhau và thứ tự của các phím rất quan trọng. Ý tưởng đằng sau điều này tương tự như cách chuỗi. Nó bao phủ đối tượng thành một chuỗi và so sánh nếu các chuỗi là một kết quả phù hợp. Về cơ bản nó so sánh sự bình đẳng của hai chuỗi. Đó là lý do tại sao đơn đặt hàng quan trọng.

Mã giải thích:

  • Nhận các phím độc đáo từ cả hai đối tượng trong một mảng phẳng.unique keys from both objects in a flat array.unique keys from both objects in a flat array.
  • Vòng lặp qua mảng và cho mỗi khóa kiểm tra xem dữ liệu dựa trên khóa đó trong cả hai đối tượng
    // es module
    import { isEqual, uniq } from "lodash";
    
    // OR commonJS
    const _ = require("lodash");
    const { isEqual, uniq } = _;
    
    const getUpdatedKey = (oldData, newData) => {
      const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);
    
      for(const key of data){
        if(!isEqual(oldData[key], newData[key])){
          return key;
        }
      }
    
      return null;
    }
    
    0 với nhau.
  • Nếu không bằng nhau, nó có nghĩa là giá trị khóa đã thay đổi. Vì vậy, hãy trả lại phím (dừng vòng lặp theo dõi của nó).
  • Nếu không có gì thay đổi, hãy trả lại
    // es module
    import { isEqual, uniq } from "lodash";
    
    // OR commonJS
    const _ = require("lodash");
    const { isEqual, uniq } = _;
    
    const getUpdatedKey = (oldData, newData) => {
      const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);
    
      for(const key of data){
        if(!isEqual(oldData[key], newData[key])){
          return key;
        }
      }
    
      return null;
    }
    
    5.

Ví dụ Dữ liệu & Kết quả

let oldObj;
let newObj;

oldObj = {
  countries: ["Pakistan", "India", "Japan", "England", "United States"],
  nationalities: ["American", "British", "Pakistani", "Indian", "Chinese"]
};

newObj = {
  countries: ["Pakistan", "India", "Japan", "England"],
  nationalities: ["American", "British", "Pakistani", "Indian", "Chinese"]
}

console.log(getUpdatedKey(oldObj, newObj)); // countries

oldObj = {
  countries: ["Pakistan", "India", "Japan", "England", "United States"],
  nationalities: ["American", "British", "Pakistani", "Indian", "Chinese"]
};

newObj = {
  countries: ["Pakistan", "India", "Japan", "United States", "England"],
  nationalities: ["American", "British", "Pakistani", "Indian", "Chinese"]
}

console.log(getUpdatedKey(oldObj, newObj)); // countries

oldObj = {
  countries: ["Pakistan", "India", "Japan", "England", "United States"],
  nationalities: ["American", "British", "Pakistani", "Indian", "Chinese"]
};

newObj = {
  countries: ["Pakistan", "India", "Japan", "England", "United States"],
  nationalities: ["American", "British", "Pakistani", "Indian"]
}

console.log(getUpdatedKey(oldObj, newObj)); // nationalities

oldObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "660 K St",
    city: "San Diego",
    state: "California",
    country: "United States"
  }
};

newObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "4914 U.S. 220 Business",
    city: "Randleman",
    state: "Nebraska",
    country: "United States"
  }
};

console.log(getUpdatedKey(oldObj, newObj)); // address


oldObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "660 K St",
    city: "San Diego",
    state: "California",
    country: "United States"
  }
};

newObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    last: "Smith"
  },
  address: {
    street: "4914 U.S. 220 Business",
    city: "Randleman",
    state: "Nebraska",
    country: "United States"
  }
};

console.log(getUpdatedKey(oldObj, newObj)); // name

Mã để nhận được nhiều khóa cập nhật

Mã trên sẽ chỉ xác định khóa đầu tiên phù hợp với các tiêu chí. Chúng tôi có thể sửa đổi một chút để trả về nhiều hơn một khóa bằng cách giữ một mảng, đẩy vào nó và trả lại nó ở cuối:

const getUpdatedKeys = (oldData, newData) => {
  const data = uniq([...Object.keys(oldData), ...Object.keys(newData)]);
  const keys = [];
  for(const key of data){
    if(!isEqual(oldData[key], newData[key])){
      keys.push(key);
    }
  }

  return keys;
}

Ví dụ cho nhiều khóa cập nhật



oldObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "660 K St",
    city: "San Diego",
    state: "California",
    country: "United States"
  }
};

newObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    last: "Smith"
  },
  address: {
    street: "4914 U.S. 220 Business",
    city: "Randleman",
    state: "Nebraska",
    country: "United States"
  }
};

console.log(getUpdatedKeys(oldObj, newObj)); // [ 'name', 'address' ]




oldObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "660 K St",
    city: "San Diego",
    state: "California",
    country: "United States",
    somethingNested: {
      a: {
        b: true
      }
    }
  }
};

newObj = {
  id: "ioj86bndom",
  name: {
    first: "John",
    middle: "Montgomery",
    last: "Smith"
  },
  address: {
    street: "660 K St",
    city: "San Diego",
    state: "California",
    country: "United States",
    somethingNested: {
      a: {
        b: false
      }
    }
  }
};


console.log(getUpdatedKeys(oldObj, newObj)); // [ 'address' ]

Xem thêm

  • JavaScript: Tìm nếu chuỗi có một trường hợp cụ thể
  • Thay thế tất cả các phím của các đối tượng lồng nhau hoặc mảng các đối tượng trong JavaScript
  • Tính tổng giá trị đầu tư với cổ tức được thêm vào
  • Hạn chế nội dung cho người dùng của các quốc gia cụ thể chỉ có JavaScript
  • Theo dõi số lượng người dùng truy cập với bộ nhớ cục bộ JavaScript
  • React JS Render Form với các trường có điều kiện động
  • React JS Render Form với dữ liệu động từ API phụ trợ

Tôi có thể so sánh hai đối tượng trong JavaScript không?

Thông thường, khi bạn so sánh các loại dữ liệu như INT và chuỗi trong JavaScript, bạn sử dụng các toán tử bình đẳng (== và ===). Tuy nhiên, so sánh các đối tượng với == và === sẽ không hoạt động. Để khắc phục điều này, một tùy chọn là xâu chuỗi cả hai đối tượng và sau đó sử dụng các toán tử bình đẳng.comparing objects with == and === will not work. To fix this, one option is to stringify both objects and then use the equality operators.comparing objects with == and === will not work. To fix this, one option is to stringify both objects and then use the equality operators.

Làm thế nào để bạn biết nếu hai đối tượng có cùng một khóa?

Cách tiếp cận: Chúng tôi sẽ tìm thấy các khóa của cả hai đối tượng theo Object.Keys (), trả về một mảng các khóa của đối tượng đó.Để kiểm tra xem mọi khóa trong OBJ1 cũng có trong OBJ2 và nếu các giá trị của các khớp chính đó, chúng tôi sẽ sử dụng mọi phương thức ().Object.keys(), which returns an array of keys of that object. For checking that every key in obj1 is also present in obj2, and if values of those key matches, we will use every() method.Object. keys(), which returns an array of keys of that object. For checking that every key in obj1 is also present in obj2, and if values of those key matches, we will use every() method.

Làm thế nào để bạn so sánh hai giá trị của các đối tượng?

Phương thức bằng () của lớp đối tượng so sánh sự bình đẳng của hai đối tượng.Hai đối tượng sẽ bằng nhau nếu chúng chia sẻ cùng một địa chỉ bộ nhớ.Cú pháp: Boolean công khai (đối tượng OBJ). The two objects will be equal if they share the same memory address. Syntax: public boolean equals(Object obj). The two objects will be equal if they share the same memory address. Syntax: public boolean equals(Object obj)

Bạn có thể sử dụng == để so sánh các đối tượng không?

So sánh các đối tượng ¶ Khi sử dụng toán tử so sánh (==), các biến đối tượng được so sánh theo cách đơn giản, cụ thể là: hai trường hợp đối tượng bằng nhau nếu chúng có cùng thuộc tính và giá trị (giá trị được so sánh với ==) và là các trường hợp củaCùng lớp.Two object instances are equal if they have the same attributes and values (values are compared with == ), and are instances of the same class.Two object instances are equal if they have the same attributes and values (values are compared with == ), and are instances of the same class.