[Javascript] تحقق مما إذا كان العنصر موجودًا في صفيف


Answers

الشفرة:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

إعدام:

isInArray(1, [1,2,3]); // true

تحديث (2017):

في المتصفحات الحديثة مع دعم ECMAScript 6 يمكنك استخدام الدالة Array.prototype.includes ، مما يجعل الأمر أكثر سهولة للتحقق مما إذا كان هناك عنصر موجود في مصفوفة:

const haystack = [1, 2, 3];
const needle = 1;
const isInArray = haystack.includes(needle);
console.log(isInArray); // true

Question

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

إن الوظيفة التي أستخدمها الآن للتحقق من ذلك هي:

function inArray(needle,haystack)
{
    var count=haystack.length;
    for(var i=0;i<count;i++)
    {
        if(haystack[i]===needle){return true;}
    }
    return false;
}

إنها تعمل. ما أبحث عنه هو ما إذا كانت هناك طريقة أفضل للقيام بذلك.




في lodash يمكنك استخدام _.includes (والتي أيضا أسماء مستعارة إلى _.contains)

يمكنك البحث في مجموعة كاملة:

_.includes([1, 2, 3], 1); // true

يمكنك البحث في الصفيف من فهرس البدء:

_.includes([1, 2, 3], 1, 1);  // false (begins search at index 1)

بحث في سلسلة:

_.includes('pebbles', 'eb');  // true (string contains eb)

يعمل أيضًا على التحقق من صفائف بسيطة من الكائنات:

_.includes({ 'user': 'fred', 'age': 40 }, 'fred');    // true
_.includes({ 'user': 'fred', 'age': false }, false);  // true

هناك شيء واحد يجب ملاحظته حول الحالة الأخيرة وهو أنه يعمل مع الأوليات مثل الأوتار ، والأرقام والبيول ، ولكن لا يمكن البحث من خلال المصفوفات أو الأشياء

_.includes({ 'user': 'fred', 'age': {} }, {});   // false
_.includes({ 'user': [1,2,3], 'age': {} }, 3);   // false



قيّدت ذلك عدة مرات على Google Chrome 52 ، ولكن لا تتردد في إرساله إلى أي وحدة تحكم أخرى في المتصفح.

~ 1500 مللي ثانية ، وتشمل (~ 2700 مللي ثانية عندما استخدمت includes() )

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.includes("test") === true){ result++; }
}
console.log(new Date().getTime() - start);

~ 1050 مللي ثانية ، indexOf

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(array.indexOf("test") > -1){ result++; }
}
console.log(new Date().getTime() - start);

~ 650 مللي ثانية ، وظيفة مخصصة

function inArray(target, array)
{

/* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */

  for(var i = 0; i < array.length; i++) 
  {
    if(array[i] === target)
    {
      return true;
    }
  }

  return false; 
}

var array = [0,1,2,3,4,5,6,7,8,9]; 
var result = 0;

var start = new Date().getTime();
for(var i = 0; i < 10000000; i++)
{
  if(inArray("test", array) === true){ result++; }
}
console.log(new Date().getTime() - start);



يمكنك استخدام indexOf ولكن لا نعمل بشكل سلس في الإصدار الأخير من internet explorer. الشفرة:

function isInArray(value, array) {
  return array.indexOf(value) > -1;
}

إعدام:

isInArray(1, [1,2,3]); // true

أقترح عليك استخدام الشفرة التالية:

function inArray(needle, haystack) {
 var length = haystack.length;
 for (var i = 0; i < length; i++) {
 if (haystack[i] == needle)
  return true;
 }
 return false;
}



منذ ECMAScript6 ، يمكن للمرء استخدام مجموعة:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false