【问题标题】:Making ...rest item first while assigning value by array destructuring [duplicate]通过数组解构分配值时首先制作...休息项目[重复]
【发布时间】:2019-02-21 03:24:06
【问题描述】:

我知道

var a = [12,23,132,12,3];
var [first, ...rest] = a;

会给first = 12rest = [23,132,12,3]

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

var a = [12,23,132,12,3];
var [...rest, last] = a;

哪个应该给我rest = [12,23,132,12]last = 3

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

SyntaxError: Rest element must be last element

我知道我可以通过反转数组然后像这样解构来实现这一点

var a = [12,23,132,12,3];
var [last, secondLast, ...rest] = a.reverse();

这将给我last = 3secondLast = 12rest = [132,23,12],然后我将再次不得不reverse() 其余部分。

我也可以使用索引并直接访问数组元素。但这不是我们想要的。

我的问题是,有没有其他方法可以实现我想要做的事情(使用休息运算符?)?

【问题讨论】:

  • 由于数组解构的设计,这是不可能的。它需要一个迭代器作为输入,并且您事先不知道迭代器将产生多少项,因此您不知道何时停止向数组推送并开始分配给最后一个目标。
  • 嗯,很有可能:let [last, secondLast, ...rest] = [...a.slice(-2).reverse(), ...a.slice(0, -2)]
  • 第一个例子不需要反向:let [last, ...rest] = [...a.slice(-1), ...a.slice(0, -1)],而且都没有突变!

标签: javascript arrays ecmascript-6 variable-assignment destructuring


【解决方案1】:

根据 destructuring assignements 上的 MDN 网站,数组解构的其余元素是数组的剩余部分,因此它应该始终是最后一个元素。

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

【讨论】:

  • 是的,没有索引。而且我知道休息应该永远是最后一个元素,但我正在寻找解决方法:)
【解决方案2】:

您可以使用带有负索引的array.slice...

const [others, last] = [a.slice(0,-1), ...a.slice(-1)]

【讨论】:

  • @Prasanna 如果你不介意改变数组,试试:const a = [...]; const b = a.pop()
【解决方案3】:

您可以使用 Destructuring assignmentArray#pop() method 来获取 last 元素和变量中的 rest

let [last, ...rest] = [a.pop(), ...a];

您可以test the results here 并看到pop() 是其他解决方案中最快的。

注意:

如果我们想保持原始数组不变,我们只需要添加删除的项目

a.push(last);
  • .pop() 调用将从array 和 影响原来的array,所以只有rest。那 完全符合您的需求。
  • 我们使用a.push(last); 来检索a 数组的初始状态,这样可以避免克隆数组或使用额外的变量来克隆a 数组。

演示:

var a = [12, 23, 132, 12, 3];

let [last, ...rest] = [a.pop(), ...a];

a.push(last);

console.log(last);
console.log(rest);
console.log(a);

【讨论】:

  • 只是一个小评论,做const [last, ...rest] = [ a.pop(), ...a ]。这将防止由于引用而发生任何突变
  • 为什么不只是let [last, rest] = [a.pop(), a];
  • 如果你要修改a,为什么还要分配rest?只需改用修改后的a
  • @MartinStone 是的,在那种特定情况下,你是对的,但通常我们应该在此之前克隆数组以避免改变原始数组。
  • 如果a 数组发生突变,我们可以在赋值后调用a.push(last);,这样我们就可以将数组恢复到其初始状态,这样可以避免克隆它并避免额外的变量。跨度>
【解决方案4】:

到目前为止,我认为改变原始数组可能是比多次反转数组更好的最佳方法。

var a = [12, 23, 132, 12, 3];
a.unshift(a.pop())
console.log(a); // [3, 12, 23, 132, 12] 

var [last, ...rest] = a;
console.log(last) // 3
console.log(rest) // [12, 23, 132, 12]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 2023-03-17
    • 2018-07-20
    • 2017-11-02
    • 2012-12-18
    • 2020-12-25
    • 2017-03-16
    相关资源
    最近更新 更多