etc./StackOverFlow

배열에 JavaScript의 값이 포함되어 있는지 어떻게 확인합니까?

청렴결백한 만능 재주꾼 2021. 9. 26. 10:52
반응형

질문자 :brad


JavaScript 배열에 값이 포함되어 있는지 확인하는 가장 간결하고 효율적인 방법은 무엇입니까?

이것이 내가 아는 유일한 방법입니다.

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

이를 수행하는 더 좋고 간결한 방법이 있습니까?



답변자 : Community Wiki


최신 브라우저에는 Array#includes . 이는 정확히 이를 수행하며 IE를 제외한 모든 사람 이 광범위하게 지원합니다.

 console.log(['joe', 'jane', 'mary'].includes('jane')); //true

덜 직접적이지만 오래된 브라우저에 대해 폴리필이 필요하지 않은 Array#indexOf 사용할 수도 있습니다.

 console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); //true


많은 프레임워크도 유사한 방법을 제공합니다.

일부 프레임워크는 이것을 함수로 구현하고 다른 프레임워크는 배열 프로토타입에 함수를 추가합니다.



답변자 : Damir Zekić


2019년 업데이트: 이 답변은 2008년(11세!)의 것이며 최신 JS 사용과 관련이 없습니다. 약속된 성능 향상은 당시 브라우저에서 수행된 벤치마크를 기반으로 했습니다. 최신 JS 실행 컨텍스트와 관련이 없을 수 있습니다. 쉬운 솔루션이 필요하면 다른 답변을 찾아보세요. 최고의 성능이 필요한 경우 관련 실행 환경에서 직접 벤치마킹하십시오.

다른 사람들이 말했듯이 배열을 통한 반복이 아마도 가장 좋은 방법일 것입니다. 그러나 JavaScript에서 반복하는 가장 빠른 방법은 while 루프를 줄이는 것이 입증되었습니다. 따라서 다음과 같이 코드를 다시 작성할 수 있습니다.

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

물론 Array 프로토타입을 확장할 수도 있습니다.

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

이제 다음을 간단히 사용할 수 있습니다.

 alert([1, 2, 3].contains(2)); // => true alert([1, 2, 3].contains('2')); // => false


답변자 : cic


indexOf 일 수도 있지만 "ECMA-262 표준에 대한 JavaScript 확장입니다. 따라서 표준의 다른 구현에는 없을 수 있습니다."

예시:

 [1, 2, 3].indexOf(1) => 0 ["foo", "bar", "baz"].indexOf("bar") => 1 [1, 2, 3].indexOf(4) => -1

AFAICS Microsoft는 이에 대한 대안 indexOf 지원하지 않는 기타 브라우저)의 배열에 유사한 기능을 추가할 수 있습니다 . 빠른 Google 검색 에서 알 수 있듯이(예: this 하나 ).



답변자 : Oriol


ECMAScript 7은 Array.prototype.includes 도입했습니다.

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

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

또한 선택적 두 번째 인수 fromIndex 허용합니다.

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

Strict Equality Comparison 을 사용하는 indexOf 와 달리 SameValueZero 등식 알고리즘을 사용하는 비교가 includes NaN 포함되어 있는지 감지할 수 있습니다.

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

indexOf 와 달리 includes 은 누락된 인덱스를 건너뛰지 않습니다.

 new Array(5).includes(undefined); // true

현재는 초안이지만 모든 브라우저에서 작동 하도록 폴리필할 수 있습니다.



답변자 : Michael


상위 답변은 기본 유형을 가정하지만 배열에 일부 특성 이 있는 객체 가 포함되어 있는지 확인하려면 Array.prototype.some() 이 우아한 솔루션입니다.

 const items = [ {a: '1'}, {a: '2'}, {a: '3'} ] items.some(item => item.a === '3') // returns true items.some(item => item.a === '4') // returns false

좋은 점은 요소가 발견되면 반복이 중단되어 불필요한 반복 주기가 절약된다는 것입니다.

또한 부울을 반환하므로 if 문에 잘 맞습니다.

 if (items.some(item => item.a === '3')) { // do something }

* jamess가 댓글에서 지적했듯이 2018년 9월 이 답변 당시 Array.prototype.some() 이 완전히 지원되었습니다. caniuse.com support table



답변자 : william malo


다음과 같이 배열을 정의했다고 가정해 보겠습니다.

 const array = [1, 2, 3, 4]

3 이 있는지 확인하는 세 가지 방법입니다. true 또는 false 반환합니다.

기본 배열 방식(ES2016 이후)( 호환성 표 )

 array.includes(3) // true

사용자 정의 배열 방법으로(ES2016 이전)

 // Prefixing the method with '_' to avoid name clashes Object.defineProperty(Array.prototype, '_includes', { value: function (v) { return this.indexOf(v) !== -1 }}) array._includes(3) // true

간단한 기능

 const includes = (a, v) => a.indexOf(v) !== -1 includes(array, 3) // true


답변자 : Már Örlygsson


다음 Array.indexOf 의 JavaScript 1.6 호환 구현입니다.

 if (!Array.indexOf) { Array.indexOf = [].indexOf ? function(arr, obj, from) { return arr.indexOf(obj, from); } : function(arr, obj, from) { // (for IE6) var l = arr.length, i = from ? parseInt((1 * from) + (from < 0 ? l : 0), 10) : 0; i = i < 0 ? 0 : i; for (; i < l; i++) { if (i in arr && arr[i] === obj) { return i; } } return -1; }; }


답변자 : Matías Cánepa


사용하다:

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


답변자 : Mason Houtz


Array 객체를 확장하는 것은 정말 나쁜 생각입니다. 왜냐하면 기존 스크립트를 깨뜨릴 수 있는 for-in 루프에 새로운 속성(사용자 정의 메서드)을 도입하기 때문입니다. 몇 년 전 Prototype 라이브러리의 작성자는 이러한 종류의 것을 제거하기 위해 라이브러리 구현을 다시 설계해야 했습니다.

페이지에서 실행 중인 다른 JavaScript와의 호환성에 대해 걱정할 필요가 없다면 선택하세요. 그렇지 않으면 더 어색하지만 더 안전한 독립형 함수 솔루션을 추천합니다.



답변자 : Kamil Kiełczewski


성능

오늘 2020.01.07 저는 Chrome v78.0.0, Safari v13.0.4 및 Firefox v71.0.0의 MacOs HighSierra 10.13.6에서 15개의 선택된 솔루션에 대한 테스트를 수행합니다. 결론

  • JSON , Set 및 놀랍게도 find (K,N,O) 기반 솔루션은 모든 브라우저에서 가장 느립니다.
  • es6 includes . 크롬에서만 빠릅니다.
  • for (C,D) 및 indexOf (G,H) 기반 솔루션은 크고 작은 배열의 모든 브라우저에서 매우 빠르므로 아마도 효율적인 솔루션을 위한 최선의 선택일 것입니다.
  • 루프 동안 인덱스가 감소하는 솔루션, (B)는 아마도 CPU 캐시가 작동 하는 방식 때문에 더 느립니다.
  • 또한 검색된 요소가 배열 길이의 66% 위치에 있을 때 큰 배열에 대한 테스트를 실행 for (C, D, E)에 기반한 솔루션은 유사한 결과를 제공합니다(~630 ops/sec - 그러나 사파리 및 파이어폭스의 E는 10 -20% C 및 D보다 느림)

결과

여기에 이미지 설명 입력

세부

10개의 요소가 있는 배열과 100만 개의 요소가 있는 배열의 2가지 테스트 케이스를 수행합니다. 두 경우 모두 검색된 요소를 배열 중간에 넣습니다.

 let log = (name,f) => console.log(`${name}: 3-${f(arr,'s10')} 's7'-${f(arr,'s7')} 6-${f(arr,6)} 's3'-${f(arr,'s3')}`) let arr = [1,2,3,4,5,'s6','s7','s8','s9','s10']; //arr = new Array(1000000).fill(123); arr[500000]=7; function A(a, val) { var i = -1; var n = a.length; while (i++<n) { if (a[i] === val) { return true; } } return false; } function B(a, val) { var i = a.length; while (i--) { if (a[i] === val) { return true; } } return false; } function C(a, val) { for (var i = 0; i < a.length; i++) { if (a[i] === val) return true; } return false; } function D(a,val) { var len = a.length; for(var i = 0 ; i < len;i++) { if(a[i] === val) return true; } return false; } function E(a, val){ var n = a.length-1; var t = n/2; for (var i = 0; i <= t; i++) { if (a[i] === val || a[ni] === val) return true; } return false; } function F(a,val) { return a.includes(val); } function G(a,val) { return a.indexOf(val)>=0; } function H(a,val) { return !!~a.indexOf(val); } function I(a, val) { return a.findIndex(x=> x==val)>=0; } function J(a,val) { return a.some(x=> x===val); } function K(a, val) { const s = JSON.stringify(val); return a.some(x => JSON.stringify(x) === s); } function L(a,val) { return !a.every(x=> x!==val); } function M(a, val) { return !!a.find(x=> x==val); } function N(a,val) { return a.filter(x=>x===val).length > 0; } function O(a, val) { return new Set(a).has(val); } log('A',A); log('B',B); log('C',C); log('D',D); log('E',E); log('F',F); log('G',G); log('H',H); log('I',I); log('J',J); log('K',K); log('L',L); log('M',M); log('N',N); log('O',O);
 This shippet only presents functions used in performance tests - it not perform tests itself!

작은 배열 - 10개 요소

여기 에서 컴퓨터에서 테스트를 수행할 수 있습니다.

여기에 이미지 설명 입력

큰 배열 - 1.000.000 요소

여기 에서 컴퓨터에서 테스트를 수행할 수 있습니다.

여기에 이미지 설명 입력



답변자 : AlonL


짧막 한 농담:

 function contains(arr, x) { return arr.filter(function(elem) { return elem == x }).length > 0; }


답변자 : MattMcKnight


잠시 생각해보면 이 호출을 여러 번 수행하는 경우 연관 배열을 사용하여 해시 함수를 사용하여 조회를 수행하는 것이 훨씬 더 효율적입니다.

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



답변자 : Eduardo Cuomo


나는 다음을 사용합니다.

 Array.prototype.contains = function (v) { return this.indexOf(v) > -1; } var a = [ 'foo', 'bar' ]; a.contains('foo'); // true a.contains('fox'); // false


답변자 : dansalmo


function contains(a, obj) { return a.some(function(element){return element == obj;}) }

Array.prototype.some() 은 5판에서 ECMA-262 표준에 추가되었습니다.



답변자 : cocco


더 빠른 양방향 indexOf / lastIndexOf 대안

2015년

새로운 방법을 포함하는 것은 매우 훌륭하지만 현재로서는 지원이 기본적으로 0입니다.

느린 indexOf/lastIndexOf 함수를 대체할 방법을 오랫동안 생각했습니다.

최고의 답변을 살펴보면 성능이 좋은 방법이 이미 발견되었습니다. 내가 선택한 것 중에서 @Damir Zekic이 게시한 가장 빠른 기능인 contains 그러나 벤치마크는 2008년부터이므로 구식이라고 명시되어 있습니다.

나는 또한 while over for 선호하지만 특별한 이유 없이 for 루프로 함수 작성을 종료했습니다. while -- 와 함께 할 수 있습니다 -- .

배열을 하면서 양쪽을 모두 체크하면 iteration이 많이 느려지는지 궁금합니다. 분명히 아니요, 따라서 이 기능은 가장 많이 투표된 기능보다 약 2배 빠릅니다. 물론 네이티브보다 빠릅니다. 이것은 검색하는 값이 배열의 시작 부분에 있는지 끝 부분에 있는지 알 수 없는 실제 환경에서 발생합니다.

값이 있는 배열을 방금 푸시했다는 것을 알고 있을 때 lastIndexOf를 사용하는 것이 아마도 가장 좋은 솔루션일 것입니다. 그러나 큰 배열을 통해 이동해야 하고 결과가 모든 곳에 있을 수 있다면 이것은 작업을 더 빠르게 만드는 확실한 솔루션이 될 수 있습니다.

양방향 indexOf/lastIndexOf

 function bidirectionalIndexOf(a, b, c, d, e){ for(c=a.length,d=c*1; c--; ){ if(a[c]==b) return c; //or this[c]===b if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b } return -1 } //Usage bidirectionalIndexOf(array,'value');

성능 테스트

http://jsperf.com/bidirectionalindexof

테스트로 100k 항목이 있는 배열을 만들었습니다.

세 가지 쿼리: 처음, 중간 및 배열 끝에서.

여러분도 이것을 흥미롭게 보고 성능을 테스트해 보시기 바랍니다.

참고 : 나는 약간 수정 볼 수 있듯이 contains 같이 IndexOf 및 lastIndexOf에서도 출력 (그래서 기본적으로 반영하기 위해 기능을 trueindexfalse 과를 -1 ). 그것이 해를 끼치면 안됩니다.

어레이 프로토타입 변형

 Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){ for(c=this.length,d=c*1; c--; ){ if(this[c]==b) return c; //or this[c]===b if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b } return -1 },writable:false, enumerable:false}); // Usage array.bidirectionalIndexOf('value');

이 함수는 또한 true 또는 false 또는 객체, 문자열 또는 무엇이든 반환하도록 쉽게 수정할 수 있습니다.

다음은 while 변형입니다.

 function bidirectionalIndexOf(a, b, c, d){ c=a.length; d=c-1; while(c--){ if(b===a[c]) return c; if(b===a[dc]) return dc; } return c } // Usage bidirectionalIndexOf(array,'value');

이것이 어떻게 가능한지?

배열에 반영된 인덱스를 구하는 간단한 계산은 너무 간단해서 실제 루프 반복을 하는 것보다 2배는 빠르다고 생각합니다.

다음은 반복당 세 번 검사를 수행하는 복잡한 예입니다. 그러나 이는 코드 속도를 저하시키는 더 긴 계산에서만 가능합니다.

http://jsperf.com/bidirectionalindexof/2



답변자 : Andru Luvisi


JavaScript 1.6 이상(Firefox 1.5 이상)을 사용하는 경우 Array.indexOf 를 사용할 수 있습니다. 그렇지 않으면 원래 코드와 비슷한 결과가 나올 것이라고 생각합니다.



답변자 : Lemex


function inArray(elem,array) { var len = array.length; for(var i = 0 ; i < len;i++) { if(array[i] == elem){return i;} } return -1; }

발견되면 배열 인덱스를 반환하고, 발견되지 않으면 -1을 반환합니다.



답변자 : dr.dimitru


이 스니펫을 사용합니다(객체, 배열, 문자열과 함께 작동).

 /* * @function * @name Object.prototype.inArray * @description Extend Object prototype within inArray function * * @param {mix} needle - Search-able needle * @param {bool} searchInKey - Search needle in keys? * */ Object.defineProperty(Object.prototype, 'inArray',{ value: function(needle, searchInKey){ var object = this; if( Object.prototype.toString.call(needle) === '[object Object]' || Object.prototype.toString.call(needle) === '[object Array]'){ needle = JSON.stringify(needle); } return Object.keys(object).some(function(key){ var value = object[key]; if( Object.prototype.toString.call(value) === '[object Object]' || Object.prototype.toString.call(value) === '[object Array]'){ value = JSON.stringify(value); } if(searchInKey){ if(value === needle || key === needle){ return true; } }else{ if(value === needle){ return true; } } }); }, writable: true, configurable: true, enumerable: false });

용법:

 var a = {one: "first", two: "second", foo: {three: "third"}}; a.inArray("first"); //true a.inArray("foo"); //false a.inArray("foo", true); //true - search by keys a.inArray({three: "third"}); //true var b = ["one", "two", "three", "four", {foo: 'val'}]; b.inArray("one"); //true b.inArray('foo'); //false b.inArray({foo: 'val'}) //true b.inArray("{foo: 'val'}") //false var c = "String"; c.inArray("S"); //true c.inArray("s"); //false c.inArray("2", true); //true c.inArray("20", true); //false


답변자 : Ztyx


배열에 개체가 있는지 반복적으로 확인하는 경우 다음을 살펴봐야 합니다.

  1. 배열에서 삽입 정렬 을 수행하여 배열을 항상 정렬된 상태로 유지(새 개체를 올바른 위치에 배치)
  2. 개체를 제거+정렬 삽입 작업으로 업데이트하고
  3. contains(a, obj) 에서 이진 검색 조회를 사용하십시오.


답변자 : Igor Barbashin


모든 최신 브라우저에서 작동하는 솔루션:

 function contains(arr, obj) { const stringifiedObj = JSON.stringify(obj); // Cache our object to not call `JSON.stringify` on every iteration return arr.some(item => JSON.stringify(item) === stringifiedObj); }

용법:

 contains([{a: 1}, {a: 2}], {a: 1}); // true

IE6+ 솔루션:

 function contains(arr, obj) { var stringifiedObj = JSON.stringify(obj) return arr.some(function (item) { return JSON.stringify(item) === stringifiedObj; }); } // .some polyfill, not needed for IE9+ if (!('some' in Array.prototype)) { Array.prototype.some = function (tester, that /*opt*/) { for (var i = 0, n = this.length; i < n; i++) { if (i in this && tester.call(that, this[i], i, this)) return true; } return false; }; }

용법:

 contains([{a: 1}, {a: 2}], {a: 1}); // true

JSON.stringify 를 사용하는 이유는 무엇입니까?

Array.indexOfArray.includes (여기에 있는 대부분의 답변도 포함)는 값이 아닌 참조로만 비교합니다.

 [{a: 1}, {a: 2}].includes({a: 1}); // false, because {a: 1} is a new object

보너스

최적화되지 않은 ES6 단일 라이너:

 [{a: 1}, {a: 2}].some(item => JSON.stringify(item) === JSON.stringify({a: 1)); // true

참고: 키가 같은 순서로 있는 경우 값으로 개체를 비교하는 것이 더 잘 작동하므로 안전을 위해 https://www.npmjs.com/package/sort-keys와 같은 패키지를 사용하여 먼저 키를 정렬할 수 있습니다.


성능 최적화로 contains 기능을 업데이트했습니다. 덕분에 itinance 을 지적.



답변자 : l3x


lodash의 일부 기능을 사용하십시오.

간결하고 정확하며 훌륭한 크로스 플랫폼 지원을 제공합니다.

수락 된 답변은 요구 사항을 충족하지도 않습니다.

요구 사항: JavaScript 배열에 개체가 포함되어 있는지 확인하는 가장 간결하고 효율적인 방법을 권장합니다.

수락된 답변:

 $.inArray({'b': 2}, [{'a': 1}, {'b': 2}]) > -1

내 추천:

 _.some([{'a': 1}, {'b': 2}], {'b': 2}) > true

노트:

$.inArray는 스칼라 값이 스칼라 배열에 존재하는지 여부를 결정하는 데 잘 작동합니다...

 $.inArray(2, [1,2]) > 1

... 그러나 질문은 객체 가 배열에 포함되어 있는지 확인하는 효율적인 방법을 분명히 요구합니다.

스칼라와 객체를 모두 처리하려면 다음을 수행할 수 있습니다.

 (_.isObject(item)) ? _.some(ary, item) : (_.indexOf(ary, item) > -1)


답변자 : Pradeep Mahdevu


ECMAScript 6에는 찾기에 대한 우아한 제안이 있습니다.

find 메소드는 콜백이 true 값을 반환하는 요소를 찾을 때까지 배열에 있는 각 요소에 대해 콜백 함수를 한 번 실행합니다. 그러한 요소가 발견되면 find는 즉시 해당 요소의 값을 반환합니다. 그렇지 않으면 find는 undefined를 반환합니다. 콜백은 값이 할당된 배열의 인덱스에 대해서만 호출됩니다. 삭제되었거나 값이 할당된 적이 없는 인덱스에 대해서는 호출되지 않습니다.

다음은 이에 대한 MDN 문서 입니다.

찾기 기능은 다음과 같이 작동합니다.

 function isPrime(element, index, array) { var start = 2; while (start <= Math.sqrt(element)) { if (element % start++ < 1) return false; } return (element > 1); } console.log( [4, 6, 8, 12].find(isPrime) ); // Undefined, not found console.log( [4, 5, 8, 12].find(isPrime) ); // 5

함수를 정의하여 ECMAScript 5 이하에서 이것을 사용할 수 있습니다.

 if (!Array.prototype.find) { Object.defineProperty(Array.prototype, 'find', { enumerable: false, configurable: true, writable: true, value: function(predicate) { if (this == null) { throw new TypeError('Array.prototype.find called on null or undefined'); } if (typeof predicate !== 'function') { throw new TypeError('predicate must be a function'); } var list = Object(this); var length = list.length >>> 0; var thisArg = arguments[1]; var value; for (var i = 0; i < length; i++) { if (i in list) { value = list[i]; if (predicate.call(thisArg, value, i, list)) { return value; } } } return undefined; } }); }


답변자 : ninjagecko


array.indexOf(x)!=-1 이 이를 수행하는 가장 간결한 방법이지만(Internet Explorer가 아닌 브라우저에서 10년 넘게 지원해 왔습니다...), O(1)이 아니라 O( N), 그것은 끔찍합니다. 배열이 변경되지 않는 경우 배열을 해시테이블로 변환한 다음 table[x]!==undefined 또는 ===undefined .

 Array.prototype.toTable = function() { var t = {}; this.forEach(function(x){t[x]=true}); return t; }

데모:

 var toRemove = [2,4].toTable(); [1,2,3,4,5].filter(function(x){return toRemove[x]===undefined})

(불행히도 Array.prototype.contains를 생성하여 배열을 "고정"하고 this._cache에 해시 테이블을 두 줄로 저장할 수 있지만 나중에 배열을 편집하기로 선택한 경우 잘못된 결과가 나타납니다. JavaScript에는 예를 들어 Python과 달리 이 상태를 유지할 수 있습니다.)



답변자 : rlib


"has()" 메서드가 있는 Set 을 사용할 수 있습니다.

 function contains(arr, obj) { var proxy = new Set(arr); if (proxy.has(obj)) return true; else return false; } var arr = ['Happy', 'New', 'Year']; console.log(contains(arr, 'Happy'));



답변자 : Mina Gabriel


사용하다:

 var myArray = ['yellow', 'orange', 'red'] ; alert(!!~myArray.indexOf('red')); //true

데모

tilde ~ 가 무엇을 하는지 정확히 알고 싶다면 이 질문을 참조하십시오 . 물결표가 표현식 앞에 올 때 물결표는 무엇을 합니까? .



답변자 : Shiva


이 요구 사항에 대한 간단한 솔루션은 find()

아래와 같은 객체 배열이 있는 경우

 var users = [{id: "101", name: "Choose one..."}, {id: "102", name: "shilpa"}, {id: "103", name: "anita"}, {id: "104", name: "admin"}, {id: "105", name: "user"}];

그런 다음 값이 있는 개체가 이미 있는지 여부를 확인할 수 있습니다.

 let data = users.find(object => object['id'] === '104');

데이터가 null이면 관리자가 없고, 그렇지 않으면 아래와 같이 기존 개체를 반환합니다.

 {id: "104", name: "admin"}

그런 다음 배열에서 해당 개체의 인덱스를 찾고 아래 코드를 사용하여 개체를 바꿀 수 있습니다.

 let indexToUpdate = users.indexOf(data); let newObject = {id: "104", name: "customer"}; users[indexToUpdate] = newObject;//your new object console.log(users);

당신은 아래와 같은 가치를 얻을 것이다

 [{id: "101", name: "Choose one..."}, {id: "102", name: "shilpa"}, {id: "103", name: "anita"}, {id: "104", name: "customer"}, {id: "105", name: "user"}];

이것이 누군가를 도울 수 있기를 바랍니다.



답변자 : Alireza


좋습니다. 결과를 얻기 위해 코드를 최적화하면 됩니다!

더 깨끗하고 더 나은 이 작업을 수행하는 방법은 여러 가지가 있지만 JSON.stringify 를 사용하여 패턴을 가져와 적용하고 싶었습니다.

 function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (JSON.stringify(a[i]) === JSON.stringify(obj)) { return true; } } return false; }


답변자 : Sumer


이 질문에 최신 구문이 추가되지 않아 2센트를 추가한 것에 놀랐습니다.

Object arObj 배열이 있고 그 안에서 obj를 검색하려고 한다고 가정해 보겠습니다.

배열.프로토타입. indexOf -> ( 인덱스 또는 -1 반환)는 일반적으로 배열에서 요소의 인덱스를 찾는 데 사용됩니다. 이것은 객체 검색에도 사용할 수 있지만 동일한 객체에 대한 참조를 전달하는 경우에만 작동합니다.

 let obj = { name: 'Sumer', age: 36 }; let arrObj = [obj, { name: 'Kishor', age: 46 }, { name: 'Rupen', age: 26 }]; console.log(arrObj.indexOf(obj));// 0 console.log(arrObj.indexOf({ name: 'Sumer', age: 36 })); //-1 console.log([1, 3, 5, 2].indexOf(2)); //3

배열.프로토타입. 포함 -> ( true 또는 false 반환)

 console.log(arrObj.includes(obj)); //true console.log(arrObj.includes({ name: 'Sumer', age: 36 })); //false console.log([1, 3, 5, 2].includes(2)); //true

배열.프로토타입. find -> (콜백을 받고 CB에서 true를 반환하는 첫 번째 값/객체를 반환).

 console.log(arrObj.find(e => e.age > 40)); //{ name: 'Kishor', age: 46 } console.log(arrObj.find(e => e.age > 40)); //{ name: 'Kishor', age: 46 } console.log([1, 3, 5, 2].find(e => e > 2)); //3

배열.프로토타입. findIndex -> (콜백을 받고 CB에서 true를 반환하는 첫 번째 값/객체의 인덱스를 반환).

 console.log(arrObj.findIndex(e => e.age > 40)); //1 console.log(arrObj.findIndex(e => e.age > 40)); //1 console.log([1, 3, 5, 2].findIndex(e => e > 2)); //1

find 및 findIndex는 콜백을 받기 때문에 참 조건을 창의적으로 설정하여 배열에서 모든 객체(참조가 없더라도)를 가져올 수 있습니다.



답변자 : sqram


결코 최고는 아니지만 나는 창의력을 발휘하고 레퍼토리에 추가하고 있었습니다.

이것을 사용하지 마십시오

 Object.defineProperty(Array.prototype, 'exists', { value: function(element, index) { var index = index || 0 return index === this.length ? -1 : this[index] === element ? index : this.exists(element, ++index) } }) // Outputs 1 console.log(['one', 'two'].exists('two')); // Outputs -1 console.log(['one', 'two'].exists('three')); console.log(['one', 'two', 'three', 'four'].exists('four'));



답변자 : Mitul Panchal


하나의 매개변수가 있습니다. 객체의 배열 번호입니다. 배열의 각 객체에는 x와 y로 표시되는 두 개의 정수 속성이 있습니다. numbers.x == numbers.y 를 만족하는 모든 객체의 개수를 반환해야 합니다.

 var numbers = [ { x: 1, y: 1 }, { x: 2, y: 3 }, { x: 3, y: 3 }, { x: 3, y: 4 }, { x: 4, y: 5 } ]; var count = 0; var n = numbers.length; for (var i =0;i<n;i++) { if(numbers[i].x==numbers[i].y) {count+=1;} } alert(count);



출처 : Here


출처 : http:www.stackoverflow.com/questions/237104/how-do-i-check-if-an-array-includes-a-value-in-javascript">

반응형