javascript - على - تحديد العنصر الأخير في مصفوفة جافا سكريبت




شرح javascript (9)

كيفية الوصول إلى العنصر الأخير من المصفوفة

انها تشبهه:

var my_array = /* some array here */;
var last_element = my_array[my_array.length - 1];

في حالتك تبدو هكذا:

var array1 = loc['f096012e-2497-485d-8adb-7ec0b9352c52'];
var last_element = array1[array1.length - 1];

أو ، في إصدار أطول ، دون إنشاء متغيرات جديدة:

loc['f096012e-2497-485d-8adb-7ec0b9352c52'][loc['f096012e-2497-485d-8adb-7ec0b9352c52'].length - 1];

كيفية إضافة طريقة للحصول عليها بطريقة أبسط

إذا كنت من المعجبين بإنشاء وظائف / اختصارات لتنفيذ مثل هذه المهام ، فإن الكود التالي:

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

سيسمح لك بالحصول على آخر عنصر في مصفوفة من خلال استدعاء last() طريقة last() في الصفيف ، في حالتك على سبيل المثال:

loc['f096012e-2497-485d-8adb-7ec0b9352c52'].last();

يمكنك التحقق من أنه يعمل هنا: http://jsfiddle.net/D4NRN/

https://code.i-harness.com

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

أقدم تطبيقًا يُحدِّث موقع ومسار المستخدم في الوقت الفعلي ويعرض هذا على خريطة 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) في كل مرة يتم فيها تحديث الموقع لانتزاع آخر موقع من القائمة واستخدامه لتحديث العلامة. كيف يمكنني تحديد هذا العنصر الأخير من الصفيف داخل التجزئة؟


استخدام مجموعة deconstruction es6 مع عامل انتشار

var last = [...yourArray].pop();

لاحظ أن yourArray لا يتغير.


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

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

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

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 (لأنك تبحث عن القيمة الرابعة إذا قمت بذلك) (هذا المستوى من العمق لأي حديث غير حذر ينتهي به الأمر هنا )).

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


يمكنك أيضًا إيقاف تشغيل العنصر الأخير. كن حذرًا ، سيؤدي ذلك إلى تغيير قيمة الصفيف ، ولكن قد يكون ذلك مناسبًا لك.

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

يمكنك تحديد getter على Array.prototype :

if (!Array.prototype.hasOwnProperty("last")) {
  Object.defineProperty(Array.prototype, "last", {
    get: function() {
      return this[this.length - 1];
    }
  });
}

console.log([9, 8, 7, 6].last); // => 6

كما ترى ، لا يبدو الوصول كمكالمة دالة ؛ تسمى الدالة getter داخليًا.


استخدم كائنات 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 arr = [1, 2, 3];
arr.slice(-1).pop(); // return 3 and arr = [1, 2, 3]

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


var last = function( obj, key ) { 
    var a = obj[key];
    return a[a.length - 1];
};

last(loc, 'f096012e-2497-485d-8adb-7ec0b9352c52');




google-maps-markers