এস in এ অ্যারের শেষ উপাদানটি পেতে বিকাশ করা হচ্ছে


116

কফিস্ক্রিপ্টে এটি সোজা:

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

এস 6 কি অনুরূপ কিছুর জন্য অনুমতি দেয়?

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

অবশ্যই আমি এটি এস 5 উপায়ে করতে পারি -

const a = b[b.length - 1]

তবে সম্ভবত এটি একটি ত্রুটি দ্বারা কিছুটা প্রবণ। স্প্ল্যাট কি কেবল ধ্বংসের শেষ জিনিস হতে পারে?


7
কেন সবাই ভাবেন যে ES6 সবকিছু পরিবর্তন করে এবং xyz করার জন্য কিছু নতুন বাক্য গঠন আছে?
ফেলিক্স ক্লিং

23
@ ফেলিক্সক্লিং প্রশ্নটি বিশেষত ...এস in- এর আচরণ সম্পর্কে , বিশেষত এটি ধ্বংসাত্মক বা পরামিতি তালিকার ক্ষেত্রে কেবল শেষ জিনিস হিসাবে ব্যবহার করা যেতে পারে। কোফিসক্রিপ্ট থেকে এস 6 এ আসা কারও পক্ষে এটি সম্ভাব্য প্রতিদ্বন্দ্বী এবং এইভাবে এই প্রশ্নটি সম্ভাব্যভাবে কার্যকর।
জর্জ সিমস

এর অর্থ [1,2,3].slice(-1)আপনি ছাড়াও এমনকি সমতুল্য অবয়বও করতে পারেন না [1,2,3].slice(0, -1)। এগুলি সাধারণ অপারেশন। ES6 ধ্বংসগুলি একরকম একটি রসিকতা!
স্ক্রিপ্টাম

@ যদি একটি বৈধ কারণ আছে - অসীম পুনরাবৃত্তি পরিচালনা করতে।
জর্জ সিমস

প্রথম প্যারামিটারটি কাজ না করায় খুব খারাপ বিশ্রাম। দুর্দান্ত হতে পারত ... এখানে কিছু উত্তর ব্যবহার করে একটি জাস্পফারফ দেওয়া হয়েছে jsperf.com/dest
संरचना-

উত্তর:


46

ES6 / 2015 এ এটি সম্ভব নয়। স্ট্যান্ডার্ডটি কেবল এটি সরবরাহ করে না।

আপনি যেমনটি অনুমানFormalParameterList করতে পারেন , তা হয় হতে পারে:

  • একটি FunctionRestParameter
  • একটি FormalsList(প্যারামেটের একটি তালিকা)
  • a FormalsList, এর পরে aFunctionRestParameter

রয়ে FunctionRestParameterপরামিতি দ্বারা অনুসরণ দেওয়া হয় না।


215

console.log('last', [1, 3, 4, 5].slice(-1));
console.log('second_to_last', [1, 3, 4, 5].slice(-2));


4
দুর্দান্ত সরল অ-পরিবর্তনীয় সমাধান solution
জ্যাক স্টিম

1
@ শনিমাল নির্ভর করে, আমি popসংস্করণটি তত দ্রুত পেয়ে যাচ্ছি (ওএস এক্স, ক্রোম 68৮ )
ডেভ নিউটন

1
@ ডেভ নিউটন তবে পপ () এর ফলে মিউটেশন ঘটেছে
অ্যান্টোনিও প্যান্টানো

1
হ্যাঁ, এটি অনুলিপিটি পরিবর্তন করে। পয়েন্টটি ছিল এটি দ্রুত হোক বা না দেওয়া উচিত নয়।
ডেভ নিউটন

53

আমি বিশ্বাস করি ES6 কমপক্ষে এটিতে সহায়তা করতে পারে:

[...arr].pop()

আপনার অ্যারে (অ্যারে) অপরিজ্ঞাত নয় এবং একটি পুনরাবৃত্তিযোগ্য উপাদান (হ্যাঁ, এমনকি স্ট্রিং কাজ করে !!), এটি সর্বশেষ উপাদানটি ফিরে আসে ... খালি অ্যারের জন্যও এবং এটি এটি কোনও পরিবর্তনও করে না। এটি যদিও একটি মধ্যবর্তী অ্যারে তৈরি করে..কিন্তু এর জন্য খুব বেশি খরচ হবে না।

আপনার উদাহরণটি এর পরে দেখতে হবে:

  console.log(  [...['a', 'b', 'program']].pop() );


6
আহ্, এটি বেশ খারাপ, এমনকি .slice(-1)[0]সামান্য কম খারাপ, বা var [last]=arr.slice().reverse()আপনার যদি প্রয়োজন হয় তবে অন্য
কুরুচিপূর্ণ হয়

6
আমি ভেবেছিলাম এই পোস্টটি ES6 / ES2015 সম্পর্কে ছিল, না? তবে আমি বিশেষ করে আপনার শেষ টুকরা পছন্দ করি। কীভাবে দুজনের সংমিশ্রণ সম্পর্কে var [last] = arr.slice(-1)
:;

13
আমার প্রিয় Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
উপায়টি

3
যদিও এটি কাজ করে এটি পরিবর্তনশীল এবং মূল অ্যারে থেকে আইটেমটি সরিয়ে দেয়। অনেক পরিস্থিতিতে আদর্শ নয়।
গাভকিলব্রাইড

4
পছন্দ করেছেন উদাহরণটি হ'ল [].concat(arr).pop();যা রূপান্তরিত হয় না arr
ড্যান

37

আপনি যা চান তার কাছাকাছি যেতে আপনি বিপরীত অ্যারেটিকে কাঠামোগত করতে পারেন।

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


2
স্মার্ট। এর চেয়ে ভাল const last = ['bbb', 'uuu', 'iii'].slice(-1);? পারফর্মেন্সের ক্ষেত্রে?
ভাদোরকোয়েস্ট

1
.slice(-1)টেকনিক্যালি দ্রুত, কিন্তু এটা আপনি উভয় শেষ আইটেম এবং এক কল, যার একটি সুবিধা মধ্যে subarray দেয় না ...splat যখন ডেসট্রাকচারিং। দীর্ঘতর অ্যারে ব্যবহার করার সময় দু'বার বিপরীত করার পারফরম্যান্স হিট বিবেচনা করা উচিত, তবে কোনও সুবিধার্থে একটি ছোট স্ক্রিপ্টের জন্য? তবে আপনি let a = array.slice(-1), rest = array.slice(0,array.length-2)এখনও ইএস 5-তে অনিলিঞ্জার চাইলে খুব সহজেই পারতেন , এটি ~ 4% দ্রুত। jsperf.com/last-array-splat
মিশ্র 3d

17

আর একটি পদ্ধতি হ'ল:

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


1
@ আইসাকবোব ইয়াপ, আপনি এখানে আছেন
ডেন কের্নি

পড়া শক্ত, বা সম্ভবত এটি আমার মস্তিষ্কের
ওয়েবজাই

এটি একাধিক
প্রপস

5

অগত্যা করার মতো সবচেয়ে পারফরম্যান্স পদ্ধতি। তবে প্রসঙ্গের উপর নির্ভর করে বেশ মার্জিত উপায় হ'ল:

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

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


3
আমি এই সমাধানটিতে কোনও কমনীয়তা দেখতে পাচ্ছি না তবে যাইহোক @ শোয়েজেল ইতিমধ্যে এটি পোস্ট করেছেন
বার্গি

2

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

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

console.log(last); // => 'c'


2
হ্যাঁ, ইতিমধ্যে অন্যান্য ডেস্ট্রাকচারিং করার সময় আমি এটি দরকারী মনে করি। নিজেই এটি ক্লাসিক সমাধান হিসাবে পড়া সহজ নয়।
andrhamm


1

আপনি এই হ্যাক চেষ্টা করতে পারেন:

let a = ['a', 'b', 'program'];
let [last] = a.reverse();
a.reverse();
console.log(last);

0

অবশ্যই, প্রশ্নটি জাভাস্ক্রিপ্ট অ্যারেগুলির জন্য ডেস্ট্রাকচারিং সম্পর্কিত , এবং আমরা জানি যে ডিস্ট্রাকচারিং অ্যাসাইনমেন্ট ব্যবহার করে কোনও অ্যারের শেষ আইটেম পাওয়া সম্ভব নয় , এটি অপরিবর্তনীয় করার উপায় আছে , নিম্নলিখিতটি দেখুন:

const arr = ['a', 'b', 'c', 'last'];

~~~
const arrDepth = arr.length - 1;

const allExceptTheLast = arr.filter( (dep, index) => index !== arrDepth && dep );
const [ theLastItem ] = arr.filter( (dep, index) => index === arrDepth && dep );

আমরা arrভেরিয়েবলটি রূপান্তরিত করি না তবুও অ্যারের হিসাবে শেষ আইটেম ব্যতীত সমস্ত অ্যারে সদস্য রয়েছে এবং সর্বশেষ আইটেমটি আলাদাভাবে রয়েছে।



0

ধ্বংসাত্মক উপায় নয় তবে সাহায্য করতে পারে। জাভাস্ক্রিপ্ট ডকুমেন্টেশন এবং বিপরীত পদ্ধতি অনুযায়ী চেষ্টা করা যেতে পারে:

const reversed = array1.reverse();
let last_item = reversed[0]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.