Javascript 通过数组分解赋值时,先生成…rest项

Javascript 通过数组分解赋值时,先生成…rest项,javascript,arrays,ecmascript-6,variable-assignment,destructuring,Javascript,Arrays,Ecmascript 6,Variable Assignment,Destructuring,我知道 var a = [12,23,132,12,3]; var [first, ...rest] = a; 将给出first=12和rest=[23132,12,3] 我想做的是将rest作为第一个变量。像这样的 var a = [12,23,132,12,3]; var [...rest, last] = a; var a = [12,23,132,12,3]; var [last, secondLast, ...rest] = a.reverse(); 哪个应该给我rest=[12

我知道

var a = [12,23,132,12,3];
var [first, ...rest] = a;
将给出
first=12
rest=[23132,12,3]

我想做的是将
rest
作为第一个变量。像这样的

var a = [12,23,132,12,3];
var [...rest, last] = a;
var a = [12,23,132,12,3];
var [last, secondLast, ...rest] = a.reverse();
哪个应该给我
rest=[12,23132,12]
last=3

但这是一个错误的语法,我会得到一个错误,会说

SyntaxError: Rest element must be last element
我知道我可以通过反转数组,然后像这样分解结构来实现这一点

var a = [12,23,132,12,3];
var [...rest, last] = a;
var a = [12,23,132,12,3];
var [last, secondLast, ...rest] = a.reverse();
这将给我
last=3
secondLast=12
rest=[132,23,12]
,然后我将不得不再次
reverse()

我还可以使用索引并直接访问数组元素。但这并不可取

我的问题是,有没有其他方法来实现我想要做的事情(使用rest操作符?)

在MDN网站上的rest元素上,数组的剩余部分是解构,因此它应该始终是最后一个元素

我知道你说不需要索引,但是像
a[a.length-1]
这样的东西可以解决你的问题

你可以使用负索引

const [others, last] = [a.slice(0,-1), ...a.slice(-1)]
您可以使用来获取变量中的
最后一个
元素和
剩余

let [last, ...rest] = [a.pop(), ...a];
您可以看到,
pop()
是其他解决方案中最快的解决方案

注意:

如果我们想保持原始数组的完整性,我们只需要添加删除的项

a.push(last);
  • .pop()
    调用将从
    数组中获取
    最后一个
    元素,然后
    影响原始的
    数组
    ,因此只有它的
    其余部分
    。那个 完全符合你的需要
  • 我们使用了
    a.push(last)
    要检索
    a
    数组的初始状态,这将避免克隆数组或使用附加变量克隆
    a
    数组
演示:

var a=[12,23,132,12,3];
让[last,…rest]=[a.pop(),…a];
a、 推(最后);
console.log(最后一个);
控制台日志(rest);

控制台日志(a)到目前为止,我认为对原始数组进行变异可能是比多次反转数组更好的最佳方法

var a=[12,23,132,12,3];
a、 取消移位(a.pop())
console.log(a);//[3, 12, 23, 132, 12] 
var[最后,…剩余]=a;
console.log(最后)//3

console.log(rest)/[12,23132,12]
是否索引。我知道rest应该始终是最后一个元素,但我正在寻找解决方法:)@Prasanna如果您不介意对数组进行变异,请尝试:
const a=[…];常量b=a.pop()
只是一个小注释,执行
常量[last,…rest]=[a.pop(),…a]
。这将防止由于引用而发生任何突变为什么不让[last,rest]=[a.pop(),a]?如果你正在变异
a
,为什么还要分配
rest
?只需使用修改后的
a
即可。@MartinStone是的,在这种情况下,您是对的,但通常我们应该在此之前克隆数组,以避免对原始数组进行变异。如果
a
数组发生变异,我们可以调用
a.push(last)在此赋值之后,我们可以将数组恢复到初始状态,这将避免克隆它和增加变量。这是不可能的,因为设计了数组分解结构。它以迭代器作为输入,您事先不知道迭代器将产生多少项,因此您不知道何时停止推送数组并开始分配给最后一个目标。嗯,这是非常可能的:
let[last,secondLast,…rest]=[…a.slice(-2).reverse(),…a.slice(0,-2)]
第一个示例不需要反转:
让[last,…rest]=[…a.slice(-1),…a.slice(0,-1)]
,并且都没有突变!