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)]
,并且都没有突变!