使用 Set 检测 JavaScript 对象值的变化

2023-11-29 22:04:57 浏览数 (1)

在JavaScript中,通常情况下,您希望知道对象文字内容是否已更改,即当用户更新/编辑其信息时。大多数开发人员通常会将信息保存到服务器,而不一定弄清楚用户是否真的改变了一两件事。

JavaScript集合是一组有序的唯一值,对于消除重复值非常有帮助。在处理离散数据时,集合是必不可少的。

代码语言:javascript复制
let nums = [4, 4, 4, 4, 2, 2, 2, 3, 3, 3];
let distinctNums = new Set(nums);

// Set(3) {4,2,3}
// 使用展开运算符将集合转换为数组
nums = [...distinctNums]; // [4, 2, 3]

上面的例子是一个具有重复值2和3的数组。当使用该数组初始化一个新的集合时,它返回了包含7个不同值的集合。就是这样工作的。

您可以在MDN上阅读更多有关集合的信息。

现在让我们继续;想象一下,Ygritte是一位来自维斯特洛北墙之北的美丽单身女士;以下是她的个人资料。

代码语言:javascript复制
let user = { name: "Ygritte", married: false, home: "North of the wall" };

然后突然之间,她遇到了她的生命中的爱人Jon Snow,他们结婚了,她搬到了Winterfell并从那时开始幸福地生活。但他们真的吗?Jon Snow你什么都不知道。因此,以下是她结婚后的个人资料。

代码语言:javascript复制
let user = { name: "Ygritte Snow", married: true, home: "Winterfell" };

但是我们的JavaScript如何检测到对象文字的值已更改呢?

这是我们将要做的:

  1. 将Ygritte结婚前和结婚后的对象值转换为可迭代的内容,即2个数组,使用Object.values()方法。
  2. 使用展开运算符合并这两个数组。
  3. 创建一个合并后数组的集合以及一个初始对象的集合。
  4. 比较结婚前集合和合并集合的大小。
代码语言:javascript复制
let before = { name: "Ygritte", married: false, home: "North of the wall" };
let after = { name: "Ygritte Snow", married: true, home: "Winterfell" };

let beforeArr = Object.values(before); // ['Ygritte', false, 'North of the wall']
let afterArr = Object.values(after); // ['Ygritte Snow', true, 'Winterfell']
let merged = [...beforeArr, ...afterArr]; // ['Ygritte', false, 'North of the wall', 'Ygritte Snow', true, 'Winterfell']

// 创建集合
let mergedSet = new Set(merged);
let beforeSet = new Set(beforeArr);

if (mergedSet.size > beforeSet.size) {
  console.log('change detected');
} else {
  console.log('No change');
}

哇!我可以解释这里发生了什么...

我们合并了两个数组,创建了一个仅返回唯一值的合并集合,并且还创建了一个前面数组的集合。然后我们使用Set的size属性比较了结婚前集合(结婚前对象的值)和合并集合(结婚前和结婚后对象的值)。通常我们将对象文字的值转换为数组,然后将数组转换为集合。

如果mergedSet的大小比beforeSet的大小大,这意味着在结婚后的对象中有新的唯一值,或者简单地说用户信息已被更新/修改。

注:

大多数对象文字都有由数据库自动生成的动态属性,例如updated_at和created_at,这些属性的值将导致对象已被更新,即使实际上并未更改。要解决这个问题,您可以在创建数组之前删除动态对象属性或在比较过程中考虑它们。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞