Hướng dẫn compare 2 object keys javascript - so sánh 2 khóa đố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.

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 isEqual

# 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 JSON.stringify[], 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 isEqual, 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 JSON.stringify[]. 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?

Chúng tôi có hai đối tượng JavaScript tương tự và chúng tôi quan tâm đến việc tìm kiếm [các] khóa nào, nếu có, đã thay đổi ở cấp độ đầu tiên. Một khóa trong đối tượng có thể giữ bất kỳ loại dữ liệu nào trong giá trị của nó, bao gồm mảng và đối tượng, và nó cũng có thể được lồng sâu. Sự thay đổi có thể có nghĩa là bất cứ điều gì, chẳng hạn như thêm, thêm vào, loại bỏ, loại bỏ khỏi, sửa đổi hoặc xáo trộn, v.v.

Loại nhận dạng chính này có thể được yêu cầu trong trường hợp bạn cần so sánh trạng thái cũ và mới, chẳng hạn như các bộ lọc trước và mới và tìm ra chính xác những gì đã thay đổi.

Dưới đây là mã để tìm một khóa đã thay đổi giá trị của nó giữa các đối tượng. Xa hơn nữa, có một mã sửa đổi để có được nhiều hơn một khóa được thay đổi.

Mật mã

Bạn có thể viết mã so sánh hoặc mã công cụ độc đáo của riêng bạn cho mảng và đối tượng. Nhưng vì nó khá phức tạp với các cấp độ lồng sâu hơn, và do đó, để phát minh lại bánh xe, tôi đã thích các phương pháp Lodash isEqual

// 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;
}
3. Mã như sau:

// 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;
}

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.
  • 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 isEqual 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.

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.

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]

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.

Bài Viết Liên Quan

Chủ Đề