2015-10-11 9 views
36

In Coffee diese einfach ist:Destrukturierung das letzte Element eines Arrays in es6 zu bekommen

coffee> a = ['a', 'b', 'program'] 
[ 'a', 'b', 'program' ] 
coffee> [_..., b] = a 
[ 'a', 'b', 'program' ] 
coffee> b 
'program' 

Does es6 für etwas ähnliches erlauben?

> 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)           

Natürlich kann ich es die ES5 Weise tun -

const a = b[b.length - 1] 

Aber vielleicht ist dies ein wenig anfällig durch einen Fehler aus. Kann der Splat nur das letzte Ding in der Destrukturierung sein?

+3

Warum denkt jeder, ES6 ändert alles und es gibt eine neue Syntax für xyz? –

+7

@FelixKling die Frage ist insbesondere über das Verhalten von '...' in es6, insbesondere, dass es nur als letzte Sache bei der Destrukturierung oder in einer Parameterliste verwendet werden kann. Dies ist potentiell kontraintuitiv für jemanden, der von Coffeescript in es6 kommt und daher ist diese Frage potentiell nützlich. –

+0

Das bedeutet neben "[1,2,3] .slice (-1)" kann man auch nicht "[1,2,3] .slice (0, -1)" äquivalent strukturieren. Dies sind übliche Operationen. ES6 Destrukturierung ist irgendwie ein Witz! – rand

Antwort

20

In ES6/2015 ist das nicht möglich. Der Standard sieht dafür nicht vor.

Wie Sie in the spec sehen kann, kann die FormalParameterList entweder:

  • ein FunctionRestParameter
  • eine FormalsList (eine Liste von parametes)
  • ein FormalsList, gefolgt von einem FunctionRestParameter

Die FunctionRestParameter gefolgt von Parametern wird nicht bereitgestellt.

Dies ist eines von vielen Beispielen, wie ES6/2015 dem CoffeeScript unterlegen ist.

18

Ich glaube ES6 konnte zumindest helfen mit, dass:

[...arr].pop() 

Angesichts Ihre Array (arr) nicht undefiniert und ein iterable Element (ja, auch Strings arbeiten !!), sollte es das letzte Element zurückkehren ..auch für das leere Array und es ändert es auch nicht. Es schafft zwar ein intermediate array..aber das sollte nicht viel kosten.

Ihr Beispiel würde dann wie folgt aussehen:

[...['a', 'b', 'program']].pop() -> 'program' 
+3

uhh, es ist ziemlich schlecht, auch '.slice (-1) [0]' ist leicht weniger schlecht, oder 'var [last] = arr.slice(). reverse()' ist ein weiterer hässlicher, wenn Sie brauchen – caub

+3

Ich dachte, dieser Beitrag war über ES6/ES2015, nein? Aber ich mag besonders dein letztes Stück. Wie wäre es, die beiden zu kombinieren: '' 'var [last] = arr.slice (-1)' '';) – shoesel

+8

ist meine bevorzugte Methode 'Object.defineProperty (Array.prototype, -1, {get() {return this [this.length - 1]}}); [1,2,3] [- 1] ' – caub

11

Sie können die umgekehrte Anordnung denaturiert, zu nahe zu kommen, was Sie wollen.

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

+2

Intelligent. Besser als const last = ['bbb', 'uuu', 'iii']. Slice (-1); '? In Bezug auf die Leistungen? – Vadorequest

63
const [last] = [1, 3, 4, 5].slice(-1) 
const [second_to_last] = [1, 3, 4, 5].slice(-2) 
+1

[Der Gewinner!] (Https://jsperf.com/desstructure-last/1) – Shanimal

+0

Schöne einfache nicht-mutative Lösung. –

1

nicht unbedingt die performante Art und Weise zu tun. Aber je nach Kontext wäre eine ziemlich elegante Art:

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

console.log(theOneIWant); // 'three' 
console.log(myArray.length); //3 
+0

Ich sehe keine Eleganz in dieser Lösung, aber @shoesel hat es sowieso schon gepostet – Bergi

Verwandte Themen