Hướng dẫn compare keys of two objects javascript - so sánh các khóa của 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.

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?

Chúng tôi không thể thực hiện toán tử == hoặc hoặc người vận hành ===, để so sánh hai đối tượng. Cách tốt hơn để thực hiện so sánh là sử dụng JSON.Stringify và so sánh các đối tượng.use JSON. Stringify and compare the objects.

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?

Trong khi phương thức bằng [] so sánh hai đối tượng.Các đối tượng bằng nhau khi chúng có cùng trạng thái [thường so sánh các biến].Các đối tượng giống hệt nhau khi họ chia sẻ danh tính lớp.Ví dụ, biểu thức obj1 == obj2 kiểm tra danh tính, không bình đẳng.equals[] method compares two objects. Objects are equal when they have the same state [usually comparing variables]. Objects are identical when they share the class identity. For example, the expression obj1==obj2 tests the identity, not equality.

Làm thế nào để bạn phù hợp với một đối tượng trong JavaScript?

Match [] là một hàm tích hợp trong javascript;Nó được sử dụng để tìm kiếm một chuỗi, cho một trận đấu, với một biểu thức thông thường.Nếu nó trả về một đối tượng mảng, kết quả phù hợp được tìm thấy, nếu không tìm thấy giá trị nào, giá trị null được trả về. is a built-in function in JavaScript; it is used to search a string, for a match, against a regular expression. If it returns an Array object the match is found, if no match is found a Null value is returned.

Chủ Đề