JavaScript数组去重与解构赋值需分步使用:先用Set等方法去重得到标准数组,再对其解构提取值;不可在解构左侧写去重表达式,对象数组需按字段归一化后处理。

JavaScript 数组去重和解构赋值是两个独立但可自然衔接的操作,它们不直接“结合”成一个语法动作,但在实际开发中常被串联使用:先去重得到干净数组,再用解构提取关键值。这种组合既简洁又语义清晰,特别适合处理接口返回的原始列表(如标签、选项、坐标、配置项等)。
去重后再解构:最常用也最推荐的方式
去重操作本身不改变数组结构,结果仍是标准数组,因此完全可以作为解构赋值的源数据。关键在于顺序不能颠倒——必须先确保数组无重复,再解构,否则可能提取到意外的冗余值。
-
使用
Set去重 + 数组解构(适用于基本类型)const raw = [1, 2, 2, 3, 3, 4]; const unique = [...new Set(raw)]; // [1, 2, 3, 4] const [first, second, ...rest] = unique; console.log(first, second); // 1, 2 console.log(rest); // [3, 4]
-
处理字符串列表,提取前两项并设默认值
立即学习“Java免费学习笔记(深入)”;
Alibabacloud Sdk Client Initialization For Java下载在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const tags = ['react', 'vue', 'react', 'svelte']; const uniqueTags = [...new Set(tags)]; // ['react', 'vue', 'svelte'] const [primary = 'none', secondary = 'none'] = uniqueTags;
解构时跳过重复项?不建议这样做
有人试图在解构过程中“边解构边去重”,比如写成 [...new Set(arr)] = arr —— 这是语法错误。解构左侧只能是模式(变量、剩余参数、嵌套结构等),不能包含表达式。去重必须发生在右侧源数据上。
对象数组去重后解构:按字段提取更实用
当数组元素是对象时,Set 无法直接去重(因为 {} !== {}),需先按某字段(如 id 或 name)归一化,再解构目标字段:
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 1, name: 'Alice' },
];
// 按 id 去重,保留唯一对象
const seen = new Map();
const uniqueUsers = users.filter(item => !seen.has(item.id) && seen.set(item.id, true));
// 解构第一个用户的关键信息
const [{ id, name } = {}] = uniqueUsers;
console.log(id, name); // 1, 'Alice'也可以一步写出解构逻辑(不推荐过度压缩,但可行):
const [{ id, name } = {}] = users.filter((item, i, arr) =>
arr.findIndex(u => u.id === item.id) === i
);注意边界情况:空数组、undefined、NaN
- 空数组解构会得到
undefined,建议配合默认值:const [a = null, b = null] = [...new Set([])]; console.log(a, b); // null, null
-
NaN在Set中会被正确视为唯一值(Set内部使用SameValueZero算法,NaN === NaN为 true),所以能去重;但用indexOf或对象键方式则不行。
不复杂但容易忽略

















