解构以获取es6中数组的最后一个元素

Geo*_*mms 93 destructuring ecmascript-6

在coffeescript中这很简单:

coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Run Code Online (Sandbox Code Playgroud)

es6是否允许类似的东西?

> const [, b] = [1, 2, 3]                              
'use strict'                                           
> b  // it got the second element, not the last one!                      
2                                                      
> const [...butLast, last] = [1, 2, 3]          
SyntaxError: repl: Unexpected token (1:17)                                                                                                                                                        
> 1 | const [...butLast, last] = [1, 2, 3]                                                                                                                                                        
    |                  ^                                                                                                                                                                          
    at Parser.pp.raise (C:\Users\user\AppData\Roaming\npm\node_modules\babel\node_modules\babel-core\node_modules\babylon\lib\parser\location.js:24:13)                                           
Run Code Online (Sandbox Code Playgroud)

当然我可以用es5方式做到 -

const a = b[b.length - 1]
Run Code Online (Sandbox Code Playgroud)

但也许这有点容易因一个错误而消失.splat只能是解构中的最后一件事吗?

Rya*_*ang 191

console.log('last', [1, 3, 4, 5].slice(-1));
console.log('second_to_last', [1, 3, 4, 5].slice(-2));
Run Code Online (Sandbox Code Playgroud)

  • 好简单的非变异解决方案. (3认同)
  • @Dave Newton 但是 pop() 导致突变 (3认同)
  • 要返回值“program”而不是“['program']”,请使用“['a','b','program'].slice(-1)[0]`。对于空数组,这将返回“未定义” (3认同)
  • @Shanimal 取决于,我得到的“pop”版本更快(OS X,Chrome 68)。 (2认同)

And*_*aus 41

在ES6/2015中是不可能的.该标准并没有规定它.

正如您在规范中看到的那样,FormalParameterList可以是:

  • 一个 FunctionRestParameter
  • a FormalsList(参数列表)
  • a FormalsList,接着是aFunctionRestParameter

说完FunctionRestParameter之后参数没有设置.


sho*_*sel 35

我相信ES6至少可以帮助解决这个问题:

[...arr].pop()
Run Code Online (Sandbox Code Playgroud)

鉴于你的数组(arr)没有未定义和一个可迭代的元素(是的,甚至字符串工作!!),它应该返回最后一个元素..即使是空数组,它也不会改变它.虽然它创建了一个中间数组但是不应该花费太多.

您的示例将如下所示:

  console.log(  [...['a', 'b', 'program']].pop() );
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢的方式是`Object.defineProperty(Array.prototype,-1,{get(){return this [this.length - 1]}}); [1,2,3] [ - 1]` (11认同)
  • 呃,这很糟糕,甚至`.slice(-1)[0]`的重要性稍差,或者`var [last] = arr.slice().reverse()`是另一个丑陋的,如果你需要的话 (6认同)
  • 我以为这篇文章是关于ES6/ES2015的,不是吗?但我特别喜欢你的最后一块.如何组合这两个:```var [last] = arr.slice(-1)```;) (6认同)
  • @GavKilbride它没有.示例与`[] .concat(arr).pop();`相同,它不会改变`arr`. (3认同)
  • 虽然这是有效的,但它会从原始数组中删除该项目.在许多场景中并不理想. (2认同)

Jef*_*ton 32

你可以解构反转阵列以接近你想要的.

const [a, ...rest] = ['a', 'b', 'program'].reverse();
  
document.body.innerHTML = 
    "<pre>"
    + "a: " + JSON.stringify(a) + "\n\n"
    + "rest: " + JSON.stringify(rest.reverse())
    + "</pre>";
Run Code Online (Sandbox Code Playgroud)

  • 聪明.比'const last = ['bbb','uuu','iii']更好.top(-1);`?在表现方面? (2认同)
  • `.slice(-1)` 在技术上更快,但它不会在一次调用中同时提供最后一项和子数组,这是解构时 `...` splat 的一个好处。在较长的阵列上使用时,要考虑两次反转的性能影响,但对于一个小脚本来说可能值得方便吗?但是,如果您仍然想要 ES5 中的 oneliner,那么您可以轻松地`let a = array.slice(-1), rest = array.slice(0,array.length-2)`,速度提高约 4%。https://jsperf.com/last-array-splat (2认同)
  • 该解决方案仍然会改变原始数组,这在现实生活场景中并不理想。 (2认同)

Den*_*rny 29

另一种方法是:

const arr = [1, 2, 3, 4, 5]
const { length, [length - 1]: last } = arr; //should be 5
console.log(last)
Run Code Online (Sandbox Code Playgroud)


Ser*_*ack 10

您可以尝试使用应用于数组的对象解构来提取length然后获取最后一项:例如:

const { length, 0: first, [length - 1]: last } = ['a', 'b', 'c', 'd']

// length = 4
// first = 'a'
// last = 'd'
Run Code Online (Sandbox Code Playgroud)

更新

另一种方法Array.prototype.at()

at() 方法采用整数值并返回该索引处的项目,允许正整数和负整数...

const last = ['a', 'b', 'c', 'd'].at(-1)
// 'd'
Run Code Online (Sandbox Code Playgroud)


小智 6

这应该有效:

const [lastone] = myArray.slice(-1);
Run Code Online (Sandbox Code Playgroud)


小智 5

不一定是最高效的方式。但是根据上下文,一种相当优雅的方式是:

const myArray = ['one', 'two', 'three'];
const theOneIWant = [...myArray].pop();

console.log(theOneIWant); // 'three'
console.log(myArray.length); //3
Run Code Online (Sandbox Code Playgroud)

  • 我在此解决方案中看不到任何优雅之处,但是无论如何@shoesel已经发布了它 (3认同)

and*_*amm 5

const arr = ['a', 'b', 'c']; // => [ 'a', 'b', 'c' ]

const {
  [arr.length - 1]: last
} = arr;

console.log(last); // => 'c'
Run Code Online (Sandbox Code Playgroud)

  • 是的,我发现它在已经进行其他解构时很有用。它本身并不像经典解决方案那么容易阅读。 (3认同)

Chi*_*jee 5

获取数组的最后一个元素:

const [last,] = ['a', 'b', 'program'].reverse();
Run Code Online (Sandbox Code Playgroud)