代码之家  ›  专栏  ›  技术社区  ›  Prasanna

通过数组解构赋值时首先生成…rest项[duplicate]

  •  2
  • Prasanna  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我知道

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

    将给予 first = 12 rest = [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();
    

    它会给我 最后=3 , secondLast = 12 rest = [132,23,12] 然后我又不得不 reverse() 其余的。

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

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

    4 回复  |  直到 6 年前
        1
  •  2
  •   cнŝdk    6 年前

    你可以用 Destructuring assignment 随着 Array#pop() method 为了得到 last 元素,以及 rest 在变量中:

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

    你可以 test the results here 看看这个 pop() 是最快的解决方案之一。

    注:

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

    a.push(last);
    
    • 这个 .pop() 打电话就能得到 最后的 元素来自 array 和 影响原始 阵列 所以只有 休息 是的。那个 完全符合你的需要。
    • 我们曾经 a.push(last); 检索的初始状态 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);
        2
  •  1
  •   ibesora    6 年前

    根据MDN网站 destructuring assignements 数组解构的rest元素是 数组的其余部分 所以它应该永远是最后一个元素。

    我知道你说不需要索引,但是 a[a.length -1] 会解决你的问题

        3
  •  0
  •   Can Zhang    6 年前

    到目前为止,我认为对origin数组进行变异可能是比多次反转数组更好的最佳方法。

    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]
        4
  •  0
  •   Martin Stone    6 年前

    你可以用 array.slice 负索引。。。

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