etc./StackOverFlow

배열에 값이 포함되어 있는지 확인 [중복]

청렴결백한 만능 재주꾼 2022. 3. 22. 11:03
반응형

질문자 :Prasad


값이 배열에 존재하는지 확인해야 합니다.

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

 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)

array value 인덱스를 반환합니다. array value 이 없으면 -1 반환합니다.

배열에 JavaScript의 개체가 포함되어 있는지 어떻게 확인합니까? 도 참조하십시오.


codeape

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 유효성 검사/사용


eyelidlessness

이것은 일반적으로 indexOf() 메서드의 용도입니다. 당신은 말할 것입니다 :

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

Gabriel Hurley

Array.prototype.includes()

ES2016에는 Array.prototype.includes() 있습니다.

includes() 메서드는 배열에 특정 요소가 포함되어 있는지 확인하여 적절하게 true 또는 false

예시

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

지원하다

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

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

Babel ( babel-polyfill ) 또는 core-js 사용하여 지원을 확장할 수 있습니다. MDN은 또한 polyfill을 제공합니다:

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

Dale

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

주어진 시간에 밑줄과 같이 매우 인기 있는 라이브러리가 이와 같은 유틸리티 기능을 수행하는 가장 효율적인 방법을 가질 것이라고 보장할 수 있기 때문에 효율성입니다.

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

전체 라이브러리를 포함하여 애플리케이션에 추가되는 대량에 대해 우려하는 경우 기능을 별도로 포함할 수 있습니다.

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

주의사항: 이전 버전의 lodash에서는 _.contains() 아니라 _.includes() 였습니다.


ncabral

Set 을 사용할 수 있습니다.

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

Nicolas

헐 박사

 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일의 내 의견은 이 논쟁을 아주 잘 설명하는 기사를 인용하지만 링크가 끊어졌고 시간이 너무 많이 지나서 원래 의견을 편집할 수 없으므로 여기에 포함시킵니다.

contains 메소드를 사용하여 내장 Array 객체를 확장하려는 경우 아마도 가장 좋고 가장 책임 있는 방법은 MDN 에서 이 폴리필을 사용하는 것입니다. (또한 프로토타입 상속에 대한 MDN 기사의 섹션을 참조하십시오. "내장 프로토타입을 확장하는 유일한 좋은 이유는 새로운 JavaScript 엔진의 기능을 백포트하는 것입니다. 예를 들어 Array.forEach 등"입니다. )

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

Trevor

나의 작은 기여:

 function isInArray(array, search) { return array.indexOf(search) >= 0; } //usage if(isInArray(my_array, "my_value")) { //... }

Matías Cánepa

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 // ie String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"} // into // "Sam" arrValues.some(namePresent, 'Sam'); => true;

ECMA 6에 액세스할 수 있는 경우 포함 방법을 사용할 수 있습니다.

MDN에는 메소드 링크가 포함됩니다.

 arrValues = ["Sam","Great", "Sample", "High"]; arrValues.includes('Sam'); => true;

SoEzPz

IE에 대한 indexOf 구현을 고려할 때(눈꺼풀 없는 상태로 설명됨):

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

rlovtang

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

Wojciech Bednarski

또 다른 옵션은 Array.some ( 사용 가능한 경우 )을 사용하는 것입니다.

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

Array.some 전달된 익명 함수 obj 동일한 요소가 있는 경우에만 true 를 반환합니다. 이러한 요소가 없으면 함수는 배열의 요소에 대해 true Array.somefalse 를 반환합니다.


Hunan Rostomyan

와우, 이 질문에 대한 훌륭한 답변이 많이 있습니다.

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

여기 실제 바이올린이 있습니다 .


Chris Schmitz

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

 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,2,3,3이기 때문에 여전히 찾습니다.

제 상황에서 이런 상황이 올지 의심스러워서 저는 이것을 사용하고 있습니다. 다른 누군가가 선택한 답변을 작동시키지 못할 경우를 대비하여 공유할 것이라고 생각했습니다.


Kakoroat

배열의 모든 값에 대해 함수를 실행하는 배열 .map 함수를 사용하는 것이 가장 깔끔해 보입니다.

참조: Array.prototype.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

Ian Vasquez

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를 나타내고 searchele은 검색할 요소를 나타냅니다(사용자가 가져옴). 인덱스를 원하면 i 값을 사용하십시오.


deeban

contains 함수에 대한 가장 간단한 솔루션은 다음과 같은 함수입니다.

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

이상적으로는 이것을 독립 실행형 함수로 만들지 않고 도우미 라이브러리의 일부로 만들 것입니다.

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

indexOf 의존할 수 없는 불운한 사람들 중 한 명 이면 MDN에서 가져온 이 polyfill 을 사용할 수 있습니다.

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

John Slegers

나는 단순함을 선호한다:

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

valeri

출처 : http:www.stackoverflow.com/questions/1181575/determine-whether-an-array-contains-a-value

반응형