首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在JS中设置奇怪的行为

在JS中设置奇怪的行为
EN

Stack Overflow用户
提问于 2021-06-24 19:32:49
回答 2查看 36关注 0票数 0

我一直试图使用集合来筛选一些独特对象的数组,但是我遇到了一个非常奇怪的错误(或者这只是我对JS的误解)。这是代码片段。

代码语言:javascript
复制
let arr = [
  { type: 'qweqwe', power: 333 },
  { type: 'qweqwe', power: 333 },
  { type: 'qweqwe', power: 333 },
];

let obj = { type: 'qweqwe', power: 333 };
const sameArr= [obj, obj, obj];

据我理解,这些数组是完全相同的,但是,让我们尝试为每个数组创建一个集合。

代码语言:javascript
复制
let arrSet = new Set(arr)
let sameArrSet = new Set(sameArr)
console.log(arrSet)
console.log(sameArrSet)

第一个日志返回集(3)(不筛选唯一)第二个日志返回集(1)(唯一)

对于更大的数组,我尝试了同样的方法,结果是一样的。

如果有人能解释给我听,我会很感激的,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-24 19:38:23

集合中的两个对象仍然不同,如{ a: true } !== { a: true } (示例值)

不能使用设置来取消复制对象数组.第二种方法之所以有效,是因为它们都指向同一个内存位置。

代码语言:javascript
复制
let obj1 = { a: true }
let obj2 = { a: true }

let obj1ref = obj1;

console.log(obj1 === obj2); // => false
console.log(obj1 === obj1ref); // => true

票数 1
EN

Stack Overflow用户

发布于 2021-06-24 19:39:33

设置存储对象引用和基元值,因此它比较浅的值。对象引用被看作是相同的,而它们自己的对象并不是平等的。

请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

要进行真正的比较,请使用以下内容:

代码语言:javascript
复制
const deepEqual = (a,b) => JSON.stringify(a) === JSON.stringify(b)

或使用以下内容创建一个唯一对象数组:

代码语言:javascript
复制
const trueUnique = (arr) =>
      [...new Set(arr.map(JSON.stringify))]
      .map(res => JSON.parse(res))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68121793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档