JavaScript数组解构:剩余运算符赋值异常问题咨询
问题原因解析
你误解了数组解构赋值的逻辑——它是按位置匹配赋值,不是按值去匹配子集,和你预先定义的y1、y2的初始值没有关系。
拆解你的代码逻辑
第一组解构
var [y1,...rest] = x:
这行代码的意思是:把数组x的第一个元素赋值给变量y1(直接覆盖了你之前定义的y1 = [{a: "a"}]),把x剩下的所有元素打包成新数组赋值给rest。你得到预期结果只是巧合,因为x第一个元素刚好和y1初始值内容一致,但本质是位置匹配,不是值匹配。第二组解构
var [y2,...rest1] = x:
同样是位置匹配:把x的第一个元素{a: "a"}赋值给y2(覆盖了之前的y2 = []),把x剩下的元素[{b: "b"}]赋值给rest1,所以才会出现你看到的结果。
实现你真正想要的需求
如果你要找出原数组中不存在于子集的元素,不能用解构赋值,得用数组的过滤方法,比如filter结合some:
var x =[{a: "a"}, {b: "b"}]; var y2 = []; // 筛选x中不在y2里的元素(对象需转字符串或按属性判断相等) var rest1 = x.filter(item => !y2.some(subItem => JSON.stringify(subItem) === JSON.stringify(item))); console.log(rest1); // 返回 [{a: "a"}, {b: "b"}]
如果对象结构固定,也可以直接对比属性(比如subItem.a === item.a),比JSON.stringify更高效。
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

