programing

항목이 JavaScript 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?

sourcetip 2022. 11. 26. 13:24
반응형

항목이 JavaScript 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?

개체가 배열에 있는지 확인하는 가장 좋은 방법은 무엇입니까?

이게 내가 아는 최선의 방법이야

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

console.log(include([1, 2, 3, 4], 3)); // true
console.log(include([1, 2, 3, 4], 6)); // undefined

ECMAScript 2016 현재 사용 가능

arr.includes(obj);

IE 또는 기타 오래된 브라우저를 지원하는 경우:

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

편집: IE6, 7, 또는8 에서는 동작하지 않습니다.가장 좋은 회피책은 존재하지 않는 경우 직접 정의하는 것입니다.

  1. Mozilla(EMA-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. Daniel James 버전:

     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. roystonacid 버전:

     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);
       }
     );
    

jQuery를 사용하는 경우:

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

상세한 것에 대하여는, http://api.jquery.com/jQuery.inArray/ 를 참조해 주세요.

번째로 ''를 실장합니다.indexOf자바스크립트를 아직 설치하지 않은 브라우저의 경우 JavaScript를 사용합니다.예를 들어 Erik Arvidsson의 어레이 엑스트라(관련 블로그 게시물)를 참조하십시오.그런 다음,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;
    };

저는 표준 기능을 사용하고 이런 종류의 미세 최적화는 꼭 필요할 때를 위해 남겨두는 것을 선호합니다.하지만 미세 최적화에 관심이 있으시다면, 저는 코멘트에 링크된 루스터노산(roysteronacid)의 벤치마크를 어레이 내의 벤치마크 검색에 적용했습니다.그러나 이 방법은 매우 조잡하기 때문에 완전한 조사를 통해 유형이나 길이가 다른 어레이를 테스트하고 서로 다른 장소에서 발생하는 개체를 찾을 수 있습니다.

배열이 정렬되지 않은 경우 더 나은 방법은 없습니다(상기 indexOf를 사용하는 것 이외에는 동일하다고 생각합니다).배열이 정렬된 경우 다음과 같이 이진 검색을 수행할 수 있습니다.

  1. 배열의 중간 요소를 선택합니다.
  2. 찾고 있는 요소가 선택한 요소보다 더 큰가요?이 경우 어레이의 하위 절반을 삭제한 것입니다.그렇지 않으면 상위 절반을 탈락시킨 것입니다.
  3. 어레이의 나머지 절반의 중간 요소를 선택하고 순서 2와 같이 진행하여 나머지 절반의 어레이를 제거합니다.결국 요소를 찾거나 검토할 배열이 남아 있지 않습니다.

이진수 검색은 배열 길이의 대수에 비례하는 시간 단위로 실행되므로 각 요소를 확인하는 것보다 훨씬 빠를 수 있습니다.

[ ] . has ( obj )

가정하여.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(){...모든 배열에 열거 가능한 요소를 추가하고 js가 끊어지기 때문입니다.

//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

두 번째 arg(표준)를 사용하면 참조 대신 값에 의한 비교를 강제할 수 있다.

원시 개체 비교

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

목적에 따라 다르죠.웹용으로 프로그래밍하는 경우indexOfInternet Explorer 6에서는 지원되지 않습니다(이 중 많은 수가 아직 사용되고 있습니다).또는 조건부 사용을 실시합니다.

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

indexOf는 네이티브 코드로 코딩되어 있기 때문에 JavaScript에서 실행할 수 있는 어떤 것보다도 빠릅니다(배열이 적절한 경우 바이너리 검색/디컷 제외).주의: 취향의 문제이지만, 저는 이 질문을 하고 싶습니다.return false;루틴이 끝날 때 진정한 부울을 반환하려면...

여기 메타지식이 있습니다.어레이로 무엇을 할 수 있는지 알고 싶다면 매뉴얼을 참조해 주세요.여기 Mozilla의 Array 페이지가 있습니다.

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

Javascript 1.6에 추가된 indexOf에 대한 참조가 표시됩니다.

개체가 javascript에서 배열인지 확인하는 강력한 방법은 다음과 같습니다.

다음은 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];
    };
}

마지막으로 in_array 함수는 다음과 같습니다.

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;
}

언급URL : https://stackoverflow.com/questions/143847/best-way-to-find-if-an-item-is-in-a-javascript-array

반응형