أفضل طريقة لمعرفة إذا كان عنصر في جافا سكريبت المصفوفة ؟ [مكررة]

StackOverflow https://stackoverflow.com/questions/143847

  •  02-07-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة لمعرفة إذا كان كائن في المصفوفة ؟

هذا هو أفضل وسيلة أعلم:

function include(arr, obj) {
    for(var i=0; i<arr.length; i++) {
        if (arr[i] == obj) return true;
    }
}

include([1,2,3,4], 3); // true
include([1,2,3,4], 6); // undefined
هل كانت مفيدة؟

المحلول

كما من ECMAScript 2016 يمكنك استخدام includes()

arr.includes(obj);

إذا كنت ترغب في دعم IE أو غيرها من المتصفحات القديمة:

function include(arr,obj) {
    return (arr.indexOf(obj) != -1);
}

تحرير:هذا لن تعمل على IE6, 7 أو 8 على الرغم من.أفضل حل هو أن تحدد بنفسك إذا كانت غير موجودة:

  1. موزيلا (ECMA-262) الإصدار:

      if (!Array.prototype.indexOf)
      {
    
           Array.prototype.indexOf = function(searchElement /*, fromIndex */)
    
        {
    
    
        "use strict";
    
        if (this === void 0 || this === null)
          throw new TypeError();
    
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0)
          return -1;
    
        var n = 0;
        if (arguments.length > 0)
        {
          n = Number(arguments[1]);
          if (n !== n)
            n = 0;
          else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
            n = (n > 0 || -1) * Math.floor(Math.abs(n));
        }
    
        if (n >= len)
          return -1;
    
        var k = n >= 0
              ? n
              : Math.max(len - Math.abs(n), 0);
    
        for (; k < len; k++)
        {
          if (k in t && t[k] === searchElement)
            return k;
        }
        return -1;
      };
    
    }
    
  2. دانيال جيمس's الإصدار:

    if (!Array.prototype.indexOf) {
      Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
      };
    }
    
  3. roosteronacid's الإصدار:

    Array.prototype.hasObject = (
      !Array.indexOf ? function (o)
      {
        var l = this.length + 1;
        while (l -= 1)
        {
            if (this[l - 1] === o)
            {
                return true;
            }
        }
        return false;
      } : function (o)
      {
        return (this.indexOf(o) !== -1);
      }
    );
    

نصائح أخرى

إذا كنت تستخدم مسج:

$.inArray(5 + 5, [ "8", "9", "10", 10 + "" ]);

لمزيد من المعلومات: http://api.jquery.com/jQuery.inArray/

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

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (obj, fromIndex) {
        if (fromIndex == null) {
            fromIndex = 0;
        } else if (fromIndex < 0) {
            fromIndex = Math.max(0, this.length + fromIndex);
        }
        for (var i = fromIndex, j = this.length; i < j; i++) {
            if (this[i] === obj)
                return i;
        }
        return -1;
    };
}

لقد تغيرت لتخزين طول بحيث لا تحتاج إلى البحث عنه في كل التكرار.ولكن الفرق ليس كبير.أقل الأغراض العامة وظيفة قد يكون أسرع:

var include = Array.prototype.indexOf ?
    function(arr, obj) { return arr.indexOf(obj) !== -1; } :
    function(arr, obj) {
        for(var i = -1, j = arr.length; ++i < j;)
            if(arr[i] === obj) return true;
        return false;
    };

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

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

  1. اختيار منتصف عنصر من الصفيف.
  2. هو العنصر الذي تبحث عنه أكبر من العنصر الذي اخترته ؟ إذا كنت القضاء على النصف السفلي من مجموعة.إذا لم يكن, لقد القضاء النصف العلوي.
  3. اختيار عنصر الوسط من النصف المتبقي من مجموعة ، والاستمرار كما في الخطوة 2 ، والقضاء على نصفين من تبقى من مجموعة.في نهاية المطاف سوف تجد أما العنصر الخاص بك أو لديك أي مجموعة اليسار للبحث عن طريق.

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

[ ].وقد(الكائنات)

على افتراض .indexOf() يتم تنفيذ

Object.defineProperty( Array.prototype,'has',
{
    value:function(o, flag){
    if (flag === undefined) {
        return this.indexOf(o) !== -1;
    } else {   // only for raw js object
        for(var v in this) {
            if( JSON.stringify(this[v]) === JSON.stringify(o)) return true;
        }
        return false;                       
    },
    // writable:false,
    // enumerable:false
})

!!!لا تجعل Array.prototype.has=function(){... لأنك سوف تضيف enumerable عنصر في كل مجموعة شبيبة مكسورة.

//use like          
[22 ,'a', {prop:'x'}].has(12) // false
["a","b"].has("a") //  true

[1,{a:1}].has({a:1},1) // true
[1,{a:1}].has({a:1}) // false

استخدام 2 الأرجنتين (العلم) قوات هذه المقارنة من حيث القيمة بدلا من مرجع

مقارنة الخام الكائنات

[o1].has(o2,true) // true if every level value is same

ذلك يعتمد على الغرض الخاص بك.إذا كان البرنامج على شبكة الإنترنت ، وتجنب indexOf, ، ليس بدعم من برنامج Internet Explorer 6 (الكثير منهم لا تزال تستخدم!), أو الاستخدام المشروط:

if (yourArray.indexOf !== undefined) result = yourArray.indexOf(target);
else result = customSlowerSearch(yourArray, target);

indexOf ربما مشفرة في التعليمات البرمجية الأصلية ، لذلك هو أسرع من أي شيء يمكنك القيام به في جافا سكريبت (ما عدا البحث الثنائية/الانقسام إذا كان الصفيف هو مناسب).ملاحظة:بل هو مسألة ذوق ، ولكن أود أن تفعل return false; في نهاية الروتين الخاص بك ، إلى عودة حقيقية منطقية...

هنا بعض الفوقية المعرفة بالنسبة لك - إذا كنت تريد أن تعرف ما يمكنك القيام به مع مجموعة ، والتحقق من الوثائق - هنا مجموعة صفحة موزيلا

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array

هناك سترى إشارة إلى indexOf وأضاف في جافا سكريبت 1.6

وسيلة قوية للتحقق ما إذا كان الكائن هو مجموعة في جافا سكريبت هو مفصل هنا:

هنا نوعان من المهام من xa.js الإطار الذي لا نعلق على utils = {} الحاوية.هذه ينبغي أن تساعدك بشكل صحيح الكشف عن المصفوفات.

var utils = {};

/**
 * utils.isArray
 *
 * Best guess if object is an array.
 */
utils.isArray = function(obj) {
     // do an instanceof check first
     if (obj instanceof Array) {
         return true;
     }
     // then check for obvious falses
     if (typeof obj !== 'object') {
         return false;
     }
     if (utils.type(obj) === 'array') {
         return true;
     }
     return false;
 };

/**
 * utils.type
 *
 * Attempt to ascertain actual object type.
 */
utils.type = function(obj) {
    if (obj === null || typeof obj === 'undefined') {
        return String (obj);
    }
    return Object.prototype.toString.call(obj)
        .replace(/\[object ([a-zA-Z]+)\]/, '$1').toLowerCase();
};

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

/**
 * Adding hasOwnProperty method if needed.
 */
if (typeof Object.prototype.hasOwnProperty !== 'function') {
    Object.prototype.hasOwnProperty = function (prop) {
        var type = utils.type(this);
        type = type.charAt(0).toUpperCase() + type.substr(1);
        return this[prop] !== undefined
            && this[prop] !== window[type].prototype[prop];
    };
}

وأخيرا هذا بالضيف وظيفة:

function in_array (needle, haystack, strict) {
    var key;

    if (strict) {
        for (key in haystack) {
            if (!haystack.hasOwnProperty[key]) continue;

            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (!haystack.hasOwnProperty[key]) continue;

            if (haystack[key] == needle) {
                return true;
            }
        }
    }

    return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top