[Javascript] تحديد العنصر الأخير في مصفوفة جافا سكريبت


Answers

استخدم طريقة slice() :

my_array.slice(-1)[0]
Question

هذا السؤال لديه بالفعل إجابة هنا:

أقدم تطبيقًا يُحدِّث موقع ومسار المستخدم في الوقت الفعلي ويعرض هذا على خريطة Google. لدي وظائف تسمح بتتبع عدة مستخدمين في نفس الوقت باستخدام كائن ، يتم تحديثه كل ثانية.

في الوقت الحالي ، عندما يضغط مستخدم على زر في تطبيق Android ، يتم إرسال الإحداثيات إلى قاعدة بيانات وفي كل مرة يتغير فيها الموقع ، يتم تحديث محدّد على الخريطة (ويتم تشكيل خط متعدد الخطوط).

نظرًا لأن لدي عدة مستخدمين ، فأرسل سلسلة أبجدية رقمية فريدة وعشوائية حتى أتمكن من عرض مسار فردي لكل مستخدم. عندما يقوم JS بسحب هذه البيانات من قاعدة البيانات ، فإنه يتحقق مما إذا كان المستخدم موجودًا ، إذا لم يكن موجودًا ، فإنه ينشئ مفتاحًا جديدًا مع وجود القيمة في القائمة. سيبدو شيء هكذا:

loc = {f096012e-2497-485d-8adb-7ec0b9352c52: [new google.maps.LatLng(39, -86),
                                              new google.maps.LatLng(38, -87),
                                              new google.maps.LatLng(37, -88)],
       44ed0662-1a9e-4c0e-9920-106258dcc3e7: [new google.maps.LatLng(40, -83),
                                              new google.maps.LatLng(41, -82),
                                              new google.maps.LatLng(42, -81)]}

ما أفعله هو تخزين قائمة بالإحداثيات كقيمة المفتاح ، وهو رقم تعريف المستخدم. يحتفظ برنامجي بتحديث هذه القائمة في كل مرة يتم فيها تغيير الموقع عن طريق إضافة إلى القائمة (وهذا يعمل بشكل صحيح).

ما أحتاجه هو تحديث موقع العلامة في كل مرة يتغير فيها الموقع. أرغب في القيام بذلك عن طريق تحديد العنصر الأخير في الصفيف حيث سيكون آخر موقع معروف. في الوقت الحالي ، في كل مرة يتم فيها تغيير الموقع ، يتم إضافة علامة جديدة إلى الخريطة (سيعرض كل نقطة من النقاط في المثال علامة في ذلك الموقع) بحيث تستمر إضافة العلامات.

يمكنني استخدام عبارة `(x في loc) في كل مرة يتم فيها تحديث الموقع لانتزاع آخر موقع من القائمة واستخدامه لتحديث العلامة. كيف يمكنني تحديد هذا العنصر الأخير من الصفيف داخل التجزئة؟




var arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]

سيؤدي هذا إلى إظهار غير معرفة إذا كان الصفيف فارغًا ولن يؤدي ذلك إلى تغيير قيمة الصفيف.




استخدم كائنات JavaScript إذا كان هذا ضروريًا للتطبيق الخاص بك. يجب ألا تستخدم الأوليات الأولية لإدارة الأجزاء المهمة من تطبيقك. حيث يبدو أن هذا هو جوهر التطبيق الخاص بك ، يجب عليك استخدام الكائنات بدلاً من ذلك. لقد كتبت بعض التعليمات البرمجية أدناه لمساعدتك على البدء. ستقوم الطريقة lastLocation بإرجاع الموقع الأخير.

function User(id) {
    this.id = id;

    this.locations = [];

    this.getId = function() {
        return this.id;
    };

    this.addLocation = function(latitude, longitude) {
        this.locations[this.locations.length] = new google.maps.LatLng(latitude, longitude);
    };

    this.lastLocation = function() {
        return this.locations[this.locations.length - 1];
    };

    this.removeLastLocation = function() {
        return this.locations.pop();
    };

}

function Users() {
    this.users = {};

    this.generateId = function() {
        return Math.random();
    };

    this.createUser = function() {
        var id = this.generateId();
        this.users[id] = new User(id);
        return this.users[id];
    };

    this.getUser = function(id) {
        return this.users[id];
    };

    this.removeUser = function(id) {
        var user = this.getUser(id);
        delete this.users[id];

        return user;
    };

}


var users = new Users();

var user = users.createUser();

user.addLocation(0, 0);
user.addLocation(0, 1);



لذا ، فإن الكثير من الناس يجيبون بالبوب ​​() ، لكن معظمهم لا يبدو أنهم يدركون أن هذه طريقة مدمرة.

var a = [1,2,3]
a.pop()
//3
//a is now [1,2]

إذن ، من أجل طريقة سخيفة وغير تدميرية:

var a = [1,2,3]
a[a.push(a.pop())-1]
//3

دفع البوب ​​، كما هو الحال في 90S :)

push إلحاق قيمة إلى نهاية صفيف ، وإرجاع طول النتيجة. وبالتالي

d=[]
d.push('life') 
//=> 1
d 
//=>['life']

pop تُرجع قيمة العنصر الأخير من صفيف ، قبل أن تزيل تلك القيمة في ذلك الفهرس. وبالتالي

c = [1,2,1]
c.pop() 
//=> 1
c 
//=> [1,2]

صفائف 0 مفهرسة ، لذلك c.length => 3، c [c.length] => undefined (لأنك تبحث عن القيمة الرابعة إذا قمت بذلك) (هذا المستوى من العمق لأي حديث غير حذر ينتهي به الأمر هنا )).

ربما ليس أفضل ، أو حتى طريقة جيدة للتطبيق الخاص بك ، ما مع حركة المرور ، كورن ، بلاه. ولكن من أجل عبور صفيف ، دفقه إلى آخر ، مجرد سخيفة بطرق غير فعالة ، هذا. هذا تماما.




في حال كنت تستخدم ES6 ، يمكنك القيام بما يلي:

const arr = [ 1, 2, 3 ];
[ ...arr ].pop(); // 3
arr; // [ 1, 2, 3 ] (wasn't changed)



Underscore و Lodash الأسلوب _.last(Array) ، التي ترجع العنصر الأخير في صفيف. كلاهما يعمل عن نفسه

_.last([5, 4, 3, 2, 1]);
=> 1

Ramda لديها أيضا وظيفة _.last

R.last(['fi', 'fo', 'fum']); //=> 'fum'





Links