programing

어레이에 값이 포함되어 있는지 확인합니다.

prostudy 2022. 9. 13. 21:36
반응형

어레이에 값이 포함되어 있는지 확인합니다.

배열에 값이 있는지 확인해야 합니다.

다음 기능을 사용하고 있습니다.

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] == obj) {
            return true;
        }
    }
    return false;
}

위의 함수는 항상 false를 반환합니다.

배열 값과 함수 호출은 다음과 같습니다.

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));

jQuery에는 이를 위한 유틸리티 기능이 있습니다.

$.inArray(value, array)

합니다.valuearray 를 반환합니다.아온온-1array에는 「」가 포함되어 않습니다.value.

자세한 내용은 JavaScript에서 배열에 개체가 포함되어 있는지 확인하는 방법을 참조하십시오.

var contains = function(needle) {
    // Per spec, the way to identify NaN is that it is not equal to itself
    var findNaN = needle !== needle;
    var indexOf;

    if(!findNaN && typeof Array.prototype.indexOf === 'function') {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function(needle) {
            var i = -1, index = -1;

            for(i = 0; i < this.length; i++) {
                var item = this[i];

                if((findNaN && item !== item) || item === needle) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    return indexOf.call(this, needle) > -1;
};

다음과 같이 사용할 수 있습니다.

var myArray = [0,1,2],
    needle = 1,
    index = contains.call(myArray, needle); // true

CodePen 검증/사용방법

이것이 일반적으로 indexOf() 메서드의 목적입니다.이렇게 말할 수 있습니다.

return arrValues.indexOf('Sam') > -1

Array.protype.includes()

ES2016에는 가 있습니다.

includes()되어 있는지 하여 메서드 반환을 수행합니다.true ★★★★★★★★★★★★★★★★★」false★★★★★★★★★★★★★★★★★,

["Sam", "Great", "Sample", "High"].includes("Sam"); // true

지지하다

kangaxMDN에 따르면 다음 플랫폼이 지원됩니다.

  • 크롬 47
  • 엣지
  • 파이어폭스 43
  • 오페라 34
  • 사파리 9
  • 노드 6

Babel을 사용하여 서포트를 확장할 수 있습니다(사용).babel-polyfill) 또는 . MDN은 폴리필도 제공합니다.

if (![].includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

Lodash와 같은 라이브러리를 사용하는 것은 브라우저 간 호환성과 효율성에 관한 모든 문제 때문에 거의 항상 안전합니다.

효율성: 언더스코어 등 매우 인기 있는 라이브러리는 이와 같은 유틸리티 기능을 실현하는 가장 효율적인 방법을 사용할 수 있습니다.

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

라이브러리 전체를 포함함으로써 응용 프로그램에 추가되는 대용량이 우려되는 경우, 다음과 같이 기능을 별도로 포함할 수 있습니다.

var includes = require('lodash/collections/includes');

주의: 이전 버전의 lodash에서는 다음과 같이 처리되었습니다._.contains()_.includes()

ECMAScript6 에서는, 다음을 사용할 수 있습니다.

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

dr;dr

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

function log(msg){
  $('#out').append('<div>' + msg + '</div>');  
}

var arr = [1, "2", NaN, true];
arr.includes = includes;

log('var arr = [1, "2", NaN, true];');
log('<br/>');
log('arr.includes(1): ' + arr.includes(1));
log('arr.includes(2): ' + arr.includes(2));
log('arr.includes("2"): ' + arr.includes("2"));
log('arr.includes(NaN): ' + arr.includes(NaN));
log('arr.includes(true): ' + arr.includes(true));
log('arr.includes(false): ' + arr.includes(false));
#out{
  font-family:monospace;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id=out></div>

장황한 내용

이 질문은 빌트인 오브젝트의 확장 여부에 관한 것이 아니라 OP의 시도와 이 답변에 대한 코멘트를 통해 그 논의가 강조되고 있습니다.13년 2월 12일 제 코멘트는 이 토론의 개요를 잘 정리한 기사를 인용하고 있는데, 그 링크가 끊어져서 원본 코멘트를 편집할 수 없어서 여기에 포함시켰습니다.

의 확장을 하고 있는Arraycontains방법은 MDN에서 제공하는 이 폴리필을 사용하는 것이 가장 적절하고 책임 있는 방법일 것입니다.(MDN 문서의 시제품 상속 관련 섹션도 참조하십시오.이 섹션은 "빌트인 프로토타입을 확장하는 유일한 이유는 새로운 JavaScript 엔진(예: Array for Each 등)의 기능을 백포트하기 위함입니다."라고 설명합니다.

if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

엄격한 평등을 원하지 않는가, 아니면 선택하고 싶은가?

function includes(k, strict) {
  strict = strict !== false; // default is true
  // strict = !!strict; // default is false
  for(var i=0; i < this.length; i++){
    if( (this[i] === k && strict) || 
        (this[i] == k && !strict) ||
        (this[i] !== this[i] && k !== k)
    ) {
      return true;
    }
  }
  return false;
}

나의 작은 공헌:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

//usage
if(isInArray(my_array, "my_value"))
{
    //...
}

ECMA 5 에 액세스 할 수 있는 경우는, 몇개의 방법을 사용할 수 있습니다.

MDN SOME 메서드 링크

arrValues = ["Sam","Great", "Sample", "High"];

function namePresent(name){
  return name === this.toString();
}
// Note:
// namePresent requires .toString() method to coerce primitive value
// i.e. String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"}
// into
// "Sam"

arrValues.some(namePresent, 'Sam');
=> true;

ECMA 6 에 액세스 할 수 있는 경우는, include 메서드를 사용할 수 있습니다.

MDN에는 메서드 링크 포함

arrValues = ["Sam","Great", "Sample", "High"];

arrValues.includes('Sam');
=> true;

IE용 indexOf 구현 시 (눈꺼풀 없음으로 설명됨)

Array.prototype.contains = function(obj) {
    return this.indexOf(obj) > -1;
};

_.indexOf 메서드를 사용하거나 Underscore.js 라이브러리 전체를 앱에 포함시키고 싶지 않은 경우 어떻게 했는지 확인하고 필요한 코드를 추출할 수 있습니다.

    _.indexOf = function(array, item, isSorted) {
    if (array == null) return -1;
    var i = 0, l = array.length;
    if (isSorted) {
      if (typeof isSorted == 'number') {
        i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);
      } else {
        i = _.sortedIndex(array, item);
        return array[i] === item ? i : -1;
      }
    }
    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
    for (; i < l; i++) if (array[i] === item) return i;
    return -1;
  };

하나의 은 ' 낫다'를 하는 것입니다.Array.some(사용 가능한 경우) 다음과 같은 방법을 사용합니다.

Array.prototype.contains = function(obj) {
  return this.some( function(e){ return e === obj } );
}

는 나나 the passed passed passed passed passed 로 넘어갔습니다.Array.sometrue에 " "와 에만"obj는 반환되지 true는, 「」를 해 주세요.Array.somefalse뿐만 아니라.

와, 이 질문에 대한 좋은 답변들이 많네요.

시간이 걸리는 건 못 봤어요.reduce하다

var searchForValue = 'pig';

var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){
    return previous || searchForValue === current ? true : false;
}, false);

console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray);

여기 그것의 작은 움직임이 있다.

제공된 답변은 효과가 없었지만, 다음과 같은 아이디어를 주었습니다.

Array.prototype.contains = function(obj)
    {
        return (this.join(',')).indexOf(obj) > -1;
    }

그룹화 이상으로 같은 아이템은 매칭이 될 수 있기 때문에 완벽하지 않습니다.내 예처럼

var c=[];
var d=[];
function a()
{
    var e = '1';
    var f = '2';
    c[0] = ['1','1'];
    c[1] = ['2','2'];
    c[2] = ['3','3'];
    d[0] = [document.getElementById('g').value,document.getElementById('h').value];

    document.getElementById('i').value = c.join(',');
    document.getElementById('j').value = d.join(',');
    document.getElementById('b').value = c.contains(d);
}

각각 1과 2를 포함하는 'g' 필드와 'h' 필드를 사용하여 이 함수를 호출해도 조인 문자열이 1,1,2,3,3이므로 이 함수는 계속 검색됩니다.

제가 이런 상황에 처할 수 있을지 의심스럽기 때문에 이것을 사용하고 있습니다.다른 사람도 선택하신 답을 만들지 못할까 봐 공유하려고요.

배열 내의 모든 값에 대해 함수를 실행하는 배열 .map 함수를 사용하는 것이 가장 깨끗한 것 같습니다.

참조: Array.protype.map()

이 방법은 단순 어레이와 객체 배열에 키/값이 있는지 확인해야 하는 객체 배열 모두에 적합합니다.

function inArray(myArray,myValue){
    var inArray = false;
    myArray.map(function(key){
        if (key === myValue){
            inArray=true;
        }
    });
    return inArray;
};

var anArray = [2,4,6,8]
console.log(inArray(anArray, 8)); // returns true
console.log(inArray(anArray, 1)); // returns false

function inArrayOfObjects(myArray,myValue,objElement){
    var inArray = false;
    myArray.map(function(arrayObj){
        if (arrayObj[objElement] === myValue) {
            inArray=true;
        }
    });
    return inArray;
};

var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}]
console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true
console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true
console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false
function setFound(){   
 var l = arr.length, textBox1 = document.getElementById("text1");
    for(var i=0; i<l;i++)
    {
     if(arr[i]==searchele){
      textBox1 .value = "Found";
      return;
     }
    }
    textBox1 .value = "Not Found";
return;
}

이 프로그램은 지정된 요소를 찾을 수 있는지 여부를 확인합니다.ID text1은 텍스트 상자의 ID를 나타내고 searchle은 검색할 요소(프론 사용자 가져오기)를 나타냅니다. 인덱스를 사용하려면 i 값을 사용하십시오.

가장 심플한 솔루션contains다음과 같은 함수가 됩니다.

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
}

단, 이 기능을 스탠드아론 기능이 아닌 도우미 라이브러리의 일부로 하는 것이 이상적입니다.

var helper = {};

helper.array = {
    contains : function (haystack, needle) {
        return !!~haystack.indexOf(needle);
    }, 
    ...
};

만약 당신이 아직 IE를 지원할 필요가 있기 때문에 의지할 수 없는 불운한 사람들 중 한 명이라면,indexOfMDN에서 얻은 다음 폴리필을 사용할 수 있습니다.

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }
    var o = Object(this);
    var len = o.length >>> 0;
    if (len === 0) {
      return -1;
    }
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }
    if (n >= len) {
      return -1;
    }
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

심플함을 선호합니다.

var days = [1, 2, 3, 4, 5];
if ( 2 in days ) {console.log('weekday');}

언급URL : https://stackoverflow.com/questions/1181575/determine-whether-an-array-contains-a-value

반응형