In Coffeescript ist dies unkompliziert:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Erlaubt es6 etwas Ähnliches?
> 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 auf die es5-Art machen -
const a = b[b.length - 1]
Aber vielleicht ist dies ein bisschen anfällig für einen Fehler. Kann der Splat nur das Letzte in der Destrukturierung sein?
ecmascript-6
destructuring
George Simms
quelle
quelle
...
in es6, insbesondere darauf, dass es nur als letztes bei der Destrukturierung oder in einer Parameterliste verwendet werden kann. Dies ist möglicherweise nicht intuitiv für jemanden, der von coffeescript zu es6 kommt, und daher ist diese Frage möglicherweise nützlich.[1,2,3].slice(-1)
Sie nicht einmal gleichwertig zerstören können[1,2,3].slice(0, -1)
. Dies sind übliche Operationen. ES6-Destrukturierung ist irgendwie ein Witz!Antworten:
In ES6 / 2015 ist dies nicht möglich. Der Standard sieht das einfach nicht vor.
Wie Sie in der Spezifikation sehen können ,
FormalParameterList
kann dies entweder sein:FunctionRestParameter
FormalsList
(eine Liste von Parametern)FormalsList
, gefolgt von aFunctionRestParameter
Das Befolgen
FunctionRestParameter
von Parametern wird nicht bereitgestellt.quelle
quelle
pop
Version so schnell wie möglich (OS X, Chrome 68).Ich glaube, ES6 könnte zumindest dabei helfen:
Da Ihr Array (arr) nicht undefiniert ist und ein iterierbares Element (ja, sogar Zeichenfolgen funktionieren !!), sollte es das letzte Element zurückgeben ... auch für das leere Array, und es ändert es auch nicht. Es wird zwar ein Zwischenarray erstellt, aber das sollte nicht viel kosten.
Ihr Beispiel würde dann so aussehen:
quelle
.slice(-1)[0]
weniger schlimm odervar [last]=arr.slice().reverse()
ist eine andere hässliche, wenn Sie brauchenvar [last] = arr.slice(-1)
;)Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
das, das nicht mutiertarr
.Sie können das umgekehrte Array zerstören, um sich dem zu nähern, was Sie möchten.
quelle
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? In Bezug auf Leistungen?.slice(-1)
ist technisch schneller, aber es gibt Ihnen nicht sowohl das letzte Element als auch das Subarray in einem Aufruf, was ein Vorteil des...
Splat bei der Destrukturierung ist. Ein Leistungseinbruch durch zweimaliges Umkehren ist bei Verwendung auf längeren Arrays zu berücksichtigen, aber für ein kleines Skript ist es wahrscheinlich die Bequemlichkeit wert? Aber Sie könnten genauso gut,let a = array.slice(-1), rest = array.slice(0,array.length-2)
wenn Sie immer noch den Oneliner in ES5 wollen, das ist ~ 4% schneller. jsperf.com/last-array-splatEin anderer Ansatz ist:
quelle
Nicht unbedingt die performanteste Art zu tun. Aber je nach Kontext wäre ein ziemlich eleganter Weg:
quelle
quelle
Das sollte funktionieren:
quelle
Sie können diesen Hack versuchen:
quelle
Auf jeden Fall, die Frage ist Destrukturierung für JavaScript - Arrays, und wir wissen , dass es nicht möglich ist , das letzte Element eines Arrays zu haben , durch die Destrukturierung Zuordnung verwendet, gibt es eine Möglichkeit , es zu tun , unveränderlich , finden Sie im folgenden:
Wir mutieren die
arr
Variable nicht, haben aber immer noch alle Array-Mitglieder außer dem letzten Element als Array und haben das letzte Element separat.quelle
quelle
Nicht zerstörend, könnte aber helfen. Laut Javascript-Dokumentation und umgekehrter Methode könnte dies versucht werden:
quelle