我一直试图使用集合来筛选一些独特对象的数组,但是我遇到了一个非常奇怪的错误(或者这只是我对JS的误解)。这是代码片段。
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];据我理解,这些数组是完全相同的,但是,让我们尝试为每个数组创建一个集合。
let arrSet = new Set(arr)
let sameArrSet = new Set(sameArr)
console.log(arrSet)
console.log(sameArrSet)第一个日志返回集(3)(不筛选唯一)第二个日志返回集(1)(唯一)
对于更大的数组,我尝试了同样的方法,结果是一样的。
如果有人能解释给我听,我会很感激的,谢谢。
发布于 2021-06-24 19:38:23
集合中的两个对象仍然不同,如{ a: true } !== { a: true } (示例值)
不能使用设置来取消复制对象数组.第二种方法之所以有效,是因为它们都指向同一个内存位置。
let obj1 = { a: true }
let obj2 = { a: true }
let obj1ref = obj1;
console.log(obj1 === obj2); // => false
console.log(obj1 === obj1ref); // => true
发布于 2021-06-24 19:39:33
设置存储对象引用和基元值,因此它比较浅的值。对象引用被看作是相同的,而它们自己的对象并不是平等的。
请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set
要进行真正的比较,请使用以下内容:
const deepEqual = (a,b) => JSON.stringify(a) === JSON.stringify(b)或使用以下内容创建一个唯一对象数组:
const trueUnique = (arr) =>
[...new Set(arr.map(JSON.stringify))]
.map(res => JSON.parse(res))https://stackoverflow.com/questions/68121793
复制相似问题