জাভাস্ক্রিপ্টের একটি শেষ পদ্ধতি নেই কেন? [বন্ধ]


124

এর কৌতূহলটি অদ্ভুত যে জাভাস্ক্রিপ্ট অ্যারে শ্রেণি অ্যারের শেষ উপাদানটি পুনরুদ্ধার করার জন্য একটি শেষ পদ্ধতি সরবরাহ করে না। আমি জানি সমাধানটি সহজ (আর [আর.লেন্থ -১]], তবে, এখনও এটি খুব ঘন ঘন ব্যবহৃত হয়।

এটি এখনও সংহত না হওয়ার গুরুতর কোন কারণ?


39
ক্ষেত্রেগুলিতে আপনি যদি পার্শ্ব-প্রতিক্রিয়া হিসাবে অ্যারে পরিবর্তন করতে আপত্তি করেন না (যেমন, যেখানে অ্যারে যাইহোক অস্থায়ী হয়) তবে এই প্রতিবাদটি হবে item= array.pop();
ববিনস করে

7
উল্লিখিত অনেক পদ্ধতির জন্য এখানে পারফরম্যান্সের মানদণ্ড রয়েছে: jsperf.com/get-last-item-from-array
Web_Designer

5
গুড আসমান, যে জন্য perf পৃষ্ঠা দিকে তাকিয়ে করার পর, দেখা array[array.length-1]হয় উপায় দ্রুত অন্যদের তুলনায়।
Jondlm

@ জন্ডিম তবে আপনি যদি ফাংশনটিতে একটি অ্যারে তৈরি করেন তবে আপনাকে এর জন্য স্থানীয় নাম উদ্ভাবন করতে হবে (এটি এরি 2 এর মতো নামগুলিতে নেতৃত্ব দেয়) এবং আপনার অনিলারারের পরিবর্তে 2 লাইনের কোড রয়েছে
নাবিক

1
(Ar[Ar.length-1])আমার জন্য 20x আরও ভাল পারফরম্যান্স পেয়েছে।
এভেজেনি সার্জিভ

উত্তর:


38

কারণ জাভাস্ক্রিপ্ট খুব ধীরে ধীরে পরিবর্তিত হয়। এবং এটি কারণ লোকেরা ধীরে ধীরে ব্রাউজারগুলি আপগ্রেড করে।

অনেক জাভাস্ক্রিপ্ট লাইব্রেরি তাদের নিজস্ব last()ফাংশন বাস্তবায়ন করে । একটি ব্যবহার করুন!


20
খুব কমপক্ষে, আপনি এমন একটি লাইব্রেরি প্রস্তাবনা বিবেচনা করতে পারেন যা বাস্তবায়ন সরবরাহ করে। উদাহরণস্বরূপ, অ্যান্ডস্কোর.জেএস একটি ভাল পছন্দ। দেখুন documentcloud.github.com/underscore/#last
শন লিঞ্চ

11
@ সীন - আমি ভেবেছিলাম যে আমি কোনও নির্দিষ্ট জাভাস্ক্রিপ্ট লাইব্রেরির মূল পোস্টারে সুপারিশ করার ব্যবসায়ের বাইরে থাকব। গুগল কোন লাইব্রেরি ব্যবহার করবে সে সম্পর্কে ওয়েবের সম্মিলিত মতামতটি মূল্যায়নের জন্য বেশ ভাল কাজ করেছে। আমি কেন একটি নির্দিষ্ট পরামর্শ দেব? প্রকৃতপক্ষে, আপনি কেন আন্ডারস্কোর.জেএস এর সুপারিশ করেছেন, যা প্রথম নজরে আমার কাছে মাসের খুব স্বাদযুক্ত মনে হয়?
ট্রিপটিচ

6
আমি লাইব্রেরির বাইরে ফাংশনটি বাস্তবায়নের নীচে উত্তরটি পছন্দ করি। এটি বলেছিল যে, গুগলের মাধ্যমে যে কেউ এই প্রশ্নটিতে হোঁচট খেয়েছে, আমি পরামর্শ দিচ্ছিলাম যে শীর্ষের উত্তরটি অন্যকে ব্যাক বোতামে না পাঠিয়ে সমাধানের জন্য তাদের অনুসন্ধান চালিয়ে যেতে সহায়তা করে।
শান লিঞ্চ

5
প্রশ্নটি ছিল "জাভাস্ক্রিপ্টে এই বৈশিষ্ট্যটি কেন নির্মিত হয়নি" "এই কার্যকারিতাটি কীভাবে অর্জন করতে পারে" নয়। মূল লেখক আসলে কীভাবে নিজের last()ফাংশন লিখবেন তা সন্ধান করছিলেন বলে ভাবার কোনও কারণ নেই । প্রশ্নটি নিজেই জাভাস্ক্রিপ্ট মূল ভাষার বিকাশের প্রকৃতি সম্পর্কে ছিল।
ট্রিপটিচ

3
তবে @ নিখিল কীভাবে এটি বাস্তবায়ন করতে চান তা জানতে চাইলে - আন্ডারস্কোরটির একটি দুর্দান্ত বর্ণিত উত্স রয়েছে। শেষের এই প্রয়োগটি বেশ জোরালো, সম্ভবত এই লেখকের আরও বেশি প্রয়োজন তবে একটি লাইব্রেরির জন্য দুর্দান্ত। ডকুমেন্টক্লাউড.
github.com/underscore/docs/…

264

আপনি এর মতো কিছু করতে পারেন:

[10, 20, 30, 40].slice(-1)[0]

কোনও ভাষাতে যে পরিমাণ সহায়ক সহায়ক যুক্ত করা যায় তা অসীম। আমি মনে করি তারা এটিকে যুক্ত করার বিষয়টি বিবেচনা করেনি।


11
"অনন্তের কাছাকাছি" জন্য ডাউনটাতে প্ররোচিত
ট্রিপটিচ

11
কেন? আপনি যত খুশি তেমন কাছাকাছি যেতে পারেন, সীমা নেই :)
vlvaro González

35
এই এক উত্তর হওয়া উচিত।
জিম্পাওলো রোডোলো

7
@ ইউপিকেক্রিক, কারণ আপনার কোনও ভেরিয়েবলে অ্যারে সংরক্ষণ করার দরকার নেই।
rmobis

5
@ VlvaroG.Vicario একটি রেফারেন্সের অ্যারে জন্য এটি ঠিক আছে, তবে আপনার উদাহরণে আপনি সংখ্যা নিয়ে কাজ করছেন। এমডিএন ডক অনুসারে: "স্লাইসটি স্ট্রিং এবং সংখ্যাগুলি নতুন অ্যারেতে অনুলিপি করে ar বিকাশকারী যদি তাদের মূল অ্যারেতে শেষ উপাদানটির মান সহ কিছু করার জন্য "অ্যারে.লাস্ট" একটি রেফারেন্স পেতে চান এবং অ্যারের মানগুলি স্ট্রিং বা সংখ্যার আক্ষরিক হতে পারে, এই পদ্ধতিটি কাজ করবে না।
1nfiniti

82

এটি নিজেকে নির্ধারণ করা সহজ। এটি জাভাস্ক্রিপ্টের শক্তি।

if(!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length - 1];
    }
}

var arr = [1, 2, 5];
arr.last(); // 5

তবে এটি তৃতীয় পক্ষের কোডে সমস্যা সৃষ্টি করতে পারে যা for..inঅ্যারেতে পুনরাবৃত্তি করতে লুপগুলি ব্যবহার করে (ভুলভাবে) ।

তবে, আপনি যদি ব্রাউজার সমর্থন সমস্যার সাথে আবদ্ধ না হন , তবে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে নতুন ES5 সিনট্যাক্স ব্যবহার করে ফাংশনটিকে অনুণনযোগ্য করে এই সমস্যাটি সমাধান করতে পারে, যেমন:

Object.defineProperty(Array.prototype, 'last', {
    enumerable: false,
    configurable: true,
    get: function() {
        return this[this.length - 1];
    },
    set: undefined
});

var arr = [1, 2, 5];
arr.last; // 5

11
নোট করুন যে অ্যারের প্রোটোটাইপগুলিতে বৈশিষ্ট্য যুক্ত করা কোডটি ভাঙ্গতে পারে যেখানে for..in এ অ্যারেতে পুনরাবৃত্তি করতে ব্যবহৃত হয়। অ্যারে পুনরুক্ত করার জন্য..ইন ব্যবহার করা খারাপ অভ্যাস, তবে এটি সাধারণত পর্যাপ্তভাবে সম্পন্ন হয় যে অ্যারের প্রোটোটাইপ পরিবর্তন করাও খারাপ অভ্যাস। সাধারণভাবে, যদি আপনার স্ক্রিপ্টটি অন্য অজানা কোডের সাথে কাজ করার প্রয়োজন হয় তবে অবজেক্ট, অ্যারে, স্ট্রিং, সংখ্যা, বুলিয়ান এবং তারিখের প্রোটোটাইপগুলি পরিবর্তন করা উচিত নয়।
দাগ নাব্বিট

7
@ না - টিপটির জন্য ধন্যবাদ। আমার উল্লেখ করা উচিত ছিল যে গণনার সাথে মিথ্যা হিসাবে সেট করা ES5 সিনট্যাক্স যুক্ত করার কারণটি for..inসমস্যাটি সমাধান করার জন্য অবশ্যই ছিল । অবশ্যই, আমরা এখনও ES5 এর বিস্তৃত বাস্তবায়নের সাথে এখনও নেই, তবে আই 99 সহ ব্রাউজারগুলি দ্রুত এটি ধরছে বলে এখনই যথেষ্ট জানা।
অনুরাগ

4
খালি তালিকার this.length - 1জন্য -1, এটির মূল্যায়ন করুন যা এটি একটি negativeণাত্মক সংখ্যা, একটি উপাদান সূচি হিসাবে নয়, অ্যারে সম্পত্তি হিসাবে বিবেচিত হবে।
মৃন্ময়

26

i = [].concat(loves).pop(); //corn

আইকন বিড়াল পপকর্ন পছন্দ করে


15
সতর্কতা: এটি কেবলমাত্র একটি উপাদান পপ করতে পুরো তালিকার একটি অনুলিপি তৈরি করে। সময় এবং স্থান উভয় ক্ষেত্রেই খুব বর্জ্য ful এটা করবেন না।
ট্রিপটিচ

13

অন্য একটি বিকল্প, বিশেষত যদি আপনি ইতিমধ্যে ইন্ডোরস্কোর ব্যবহার করছেন, তা হ'ল:

_.last([1, 2, 3, 4]); // Will return 4

5
Array.prototype.last = Array.prototype.last || function() {
    var l = this.length;
    return this[l-1];
}

x = [1,2];
alert( x.last() )

[]। সর্বশেষ () এর জন্য উপযুক্ত আউটপুট কী হওয়া উচিত? nullবা undefined?
vlvaro González

1
সম্ভবত এটি ভাষা অনুসারে ধারাবাহিক রাখতে অপরিজ্ঞাত।
মধ্যবিত্ত ওমুরিলিভ

নাল আমি মনে করি- কারণ আপনার কাছে একটি অ্যারে ভালভাবে সংজ্ঞায়িত হয়েছে - কেবল এটির মধ্যে কোনও বৈধ অবজেক্ট নেই। অপরিজ্ঞাত কেবল তখনই ব্যবহার করা উচিত যখন সর্বশেষ 'সম্পত্তি' কল পাত্রে সংজ্ঞায়িত করা হয় না।
নিখিল গার্গ

3
কেবল ফিরে আসা this[l-1]আপনাকে undefinedঅস্তিত্বের বৈশিষ্ট্য অ্যাক্সেস করার স্বাভাবিক হিসাবে দেয়। ব্যক্তিগতভাবে আমি জেএস পরিবর্তে ফিরে আসার পরিবর্তে একটি ব্যতিক্রম ছুঁড়েছি undefined, তবে জেএস কম্বলটির নীচে ত্রুটিগুলি স্যুইপ করতে পছন্দ করে।
ববিনস করুন

4

আমি নিজেই এই প্রশ্নের উত্তর খুঁজতে এসেছি। স্লাইস উত্তরটি সম্ভবত সেরা, তবে আমি এগিয়ে গিয়ে প্রোটোটাইপগুলি প্রসারিত করার অনুশীলন করতে একটি "শেষ" ফাংশন তৈরি করেছি, তাই আমি ভেবেছিলাম আমি এগিয়ে গিয়ে ভাগ করে নেব। অ্যারের মাধ্যমে আপনাকে optionচ্ছিকভাবে পিছনের দিকে গণনা করাতে এবং দ্বিতীয় থেকে শেষ বা তৃতীয় থেকে শেষ আইটেমটি টেনে আনা, আরও কিছু করার জন্য এটির অতিরিক্ত সুবিধা রয়েছে। যদি আপনি কোনও গণনা নির্দিষ্ট না করে থাকেন তবে এটি কেবল 1 এ ডিফল্ট হয় এবং শেষ আইটেমটি টেনে আনে।

Array.prototype.last = Array.prototype.last || function(count) {
    count = count || 1;
    var length = this.length;
    if (count <= length) {
        return this[length - count];
    } else {
        return null;
    }
};

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.last(); // returns 9
arr.last(4); // returns 6
arr.last(9); // returns 1
arr.last(10); // returns null

আপনি যখন ব্যবহার করেন last(4)বা last(9)আপনি ফাংশন নামের অর্থ হারাবেন, অর্থাত্; last
প্রশান্ত শ্যামপ্রসাদ

3

শেষ উপাদানগুলি টুকরো টুকরো করার আরও একটি সহজ উপায়

 var tags = [1, 2, 3, "foo", "bar", "foobar", "barfoo"];
 var lastObj = tags.slice(-1);

lastObjএখন ["barfoo"]

পাইথন এটি একইভাবে করে এবং আমি যখন জেএস ব্যবহার করার চেষ্টা করি তখন এটি কার্যকর হয়। আমি অনুমান করছি যে স্ক্রিপ্টিং ভাষাগুলিতে স্ট্রিং ম্যানিপুলেশন একইভাবে কাজ করে।

একইভাবে, আপনি যদি অ্যারেতে শেষ দুটি বস্তু চান,

var lastTwoObj = tags.slice(-2)

তোমাকে দেবে ["foobar", "barfoo"]ইত্যাদি।


@ জাকুব সম্পাদনার জন্য আপনাকে ধন্যবাদ। আমি গুরুত্বপূর্ণ নেতিবাচক চিহ্নটি মিস করেছি।
প্রশান্ত

না, lastObjথাকবে ["barfoo"]। যে কোনও ক্ষেত্রে আমি কেন ন্যায়বিচারের Array.prototype.slice.call(tagsপরিবর্তে করব tags.slice?


-1

হ্যাঁ, বা ঠিক:

var arr = [1, 2, 5];
arr.reverse()[0]

আপনি যদি মান চান, এবং একটি নতুন তালিকা না।


10
নিশ্চিত নয়, তবে এটি বেশ ধীর বলে মনে হচ্ছে
জোনাথন আজুলায়

3
ধীর হওয়া ছাড়াও এটির একটি বাজে পার্শ্ব প্রতিক্রিয়া রয়েছে যা মূল অ্যারেটি বিপরীত হয়।
স্টিফান কোয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.