javascript - objects - js object




الحصول على فهرس الكائن داخل صفيف ، مطابقة شرط (9)

كيف يمكنني الحصول على فهرس الكائن الذي يتطابق مع شرط ما (بدون التكرار على طول الصفيف)؟

لا يمكنك ، شيء ما يجب أن تتكرر خلال الصفيف (مرة واحدة على الأقل).

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

var index;
yourArray.some(function(entry, i) {
    if (entry.prop2 == "yutu") {
        index = i;
        return true;
    }
});

يستخدم الدالة الجديدة (ish) Array#some ، والتي تتدفق عبر المداخل في الصفيف حتى تعود الدالة التي تعطيها إلى true. تعمل الوظيفة التي قمت بها على حفظ فهرس الإدخال المطابق ، ثم تقوم بإرجاع true لإيقاف التكرار.

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

ولكن إذا كنت ستستخدم دائمًا نفس الخاصية لهذا البحث ، وإذا كانت قيم الخاصية فريدة ، فيمكنك إجراء تكرار مرة واحدة فقط وإنشاء كائن لتعيينها:

var prop2map = {};
yourArray.forEach(function(entry) {
    prop2map[entry.prop2] = entry;
});

(أو ، مرة أخرى ، يمكنك استخدام حلقة for أو أي من الخيارات الأخرى .)

ثم إذا كنت بحاجة إلى العثور على الإدخال بـ prop2 = "yutu" ، فيمكنك القيام بذلك:

var entry = prop2map["yutu"];

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

لدي مصفوفة مثل هذا:

[{prop1:"abc",prop2:"qwe"},{prop1:"bnmb",prop2:"yutu"},{prop1:"zxvz",prop2:"qwrq"},...]

كيف يمكنني الحصول على فهرس الكائن الذي يتطابق مع شرط ، دون تكرار في الصفيف بأكمله؟

على سبيل المثال ، أعطيت prop2=="yutu" ، أريد الحصول على الرقم 1 .

لقد رأيت .indexOf() ولكن أعتقد أنها تستخدم لمصفوفات بسيطة مثل ["a1","a2",...] . قمت أيضاً بفحص $.grep() ولكن هذا يرجع الكائنات وليس الفهرس.


اعتبارًا من عام 2016 ، من المفترض أن تستخدم Array.findIndex (مقياس ES2015 / ES6) لهذا:

a = [
  {prop1:"abc",prop2:"qwe"},
  {prop1:"bnmb",prop2:"yutu"},
  {prop1:"zxvz",prop2:"qwrq"}];
    
index = a.findIndex(x => x.prop2=="yutu");

console.log(index);

إنه مدعوم في Google Chrome و Firefox و Edge. بالنسبة إلى Internet Explorer ، هناك polyfill على الصفحة المرتبطة.

الجواب القديم:

مع jQuery:

indexes = $.map(list, function(obj, index) {
    if(obj.prop2 == "yutu") {
        return index;
    }
})

firstIndex = indexes[0]

بدون jQuery ، أكثر تعقيدًا قليلاً:

indexes = list.map(function(obj, index) {
    if(obj.prop2 == "yutu") {
        return index;
    }
}).filter(isFinite)

خطوة واحدة باستخدام Array.reduce () - لا jQuery

var items = [{id: 331}, {id: 220}, {id: 872}];

var searchIndexForId = 220;
var index = items.reduce(function(searchIndex, item, index){
  if(item.id === searchIndexForId) { 
    console.log('found!');
    searchIndex = index;
  }
  return searchIndex;
}, null);

سيعود null إذا لم يتم العثور على الفهرس.


لقد رأيت العديد من الحلول في ما سبق.

هنا أستخدم وظيفة الخريطة للعثور على فهرس نص البحث في كائن مصفوفة.

سأشرح إجابتي باستخدام بيانات الطلاب.

  • الخطوة 1 : إنشاء كائن المصفوفة للطلاب (اختياري يمكنك إنشاء كائن المصفوفة الخاص بك).
    var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];

  • الخطوة 2 : إنشاء متغير للبحث في النص
    var studentNameToSearch = "Divya";

  • الخطوة 3 : إنشاء متغير لتخزين فهرس متطابق (هنا نستخدم وظيفة الخريطة للتكرار).
    var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);

var students = [{name:"Rambabu",htno:"1245"},{name:"Divya",htno:"1246"},{name:"poojitha",htno:"1247"},{name:"magitha",htno:"1248"}];

var studentNameToSearch = "Divya";

var matchedIndex = students.map(function (obj) { return obj.name; }).indexOf(studentNameToSearch);

console.log(matchedIndex);

alert("Your search name index in array is:"+matchedIndex)


ما قاله TJ Crowder ، سيكون لكل نوع من التكرار المخفي ، مع هذا يصبح:

var index = _.findIndex(array, {prop2: 'yutu'})

وقد ذكر جورج بالفعل ES6 لديك Array.findIndex لهذا الغرض. بعض الحلول الأخرى هي الحل البديل لـ ES5 باستخدام طريقة Array.some.

نهج واحد أكثر أناقة يمكن أن يكون

var index;
for(index = yourArray.length; index-- > 0 && yourArray[index].prop2 !== "yutu";);

في الوقت نفسه ، أود أن أؤكد ، Array.some يمكن تنفيذها مع تقنية البحث الثنائية أو غيرها من الكفاءة الفعالة. لذلك ، قد يؤدي أداءً أفضل للحلقة في بعض المتصفحات.


function findIndexByKeyValue(_array, key, value) {
    for (var i = 0; i < _array.length; i++) { 
        if (_array[i][key] == value) {
            return i;
        }
    }
    return -1;
}
var a = [
    {prop1:"abc",prop2:"qwe"},
    {prop1:"bnmb",prop2:"yutu"},
    {prop1:"zxvz",prop2:"qwrq"}];
var index = findIndexByKeyValue(a, 'prop2', 'yutu');
console.log(index);

var CarId = 23; //Or other property name

//x.VehicleId property to match in the object array
var carIndex = CarsList.map(function (x) { return x.VehicleId; }).indexOf(CarId);

var list =  [
                {prop1:"abc",prop2:"qwe"},
                {prop1:"bnmb",prop2:"yutu"},
                {prop1:"zxvz",prop2:"qwrq"}
            ];

var findProp = p => {
    var index = -1;
    $.each(list, (i, o) => {
        if(o.prop2 == p) {
            index = i;
            return false; // break
        }
    });
    return index; // -1 == not found, else == index
}




arrays