JavaScript 배열에 값이 포함되어 있는지 확인하는 가장 간결하고 효율적인 방법은 무엇입니까?
이것이 내가 아는 유일한 방법입니다.
function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (a[i] === obj) { return true; } } return false; }
이를 수행하는 더 좋고 간결한 방법이 있습니까?
질문자 :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
많은 프레임워크도 유사한 방법을 제공합니다.
$.inArray(value, array, [fromIndex])
_.contains(array, value)
(별칭 _.include
및 _.includes
)dojo.indexOf(array, value, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
array.indexOf(value)
Ext.Array.contains(array, value)
_.includes(array, value, [from])
(4.0.0 이전 _.contains
R.includes(value, array)
일부 프레임워크는 이것을 함수로 구현하고 다른 프레임워크는 배열 프로토타입에 함수를 추가합니다.
답변자 : 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
반환합니다.
array.includes(3) // true
// 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) 기반 솔루션은 모든 브라우저에서 가장 느립니다.includes
. 크롬에서만 빠릅니다.for
(C,D) 및 indexOf
(G,H) 기반 솔루션은 크고 작은 배열의 모든 브라우저에서 매우 빠르므로 아마도 효율적인 솔루션을 위한 최선의 선택일 것입니다.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
대안
새로운 방법을 포함하는 것은 매우 훌륭하지만 현재로서는 지원이 기본적으로 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에서도 출력 (그래서 기본적으로 반영하기 위해 기능을 true
와 index
와 false
과를 -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배는 빠르다고 생각합니다.
다음은 반복당 세 번 검사를 수행하는 복잡한 예입니다. 그러나 이는 코드 속도를 저하시키는 더 긴 계산에서만 가능합니다.
답변자 : 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
배열에 개체가 있는지 반복적으로 확인하는 경우 다음을 살펴봐야 합니다.
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.indexOf
및 Array.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">
'for' 루프에서 인덱스에 액세스합니까? (0) | 2021.09.26 |
---|---|
슬라이스 표기법 이해 (0) | 2021.09.26 |
단어가 포함되지 않은 줄과 일치하는 정규식 (0) | 2021.09.26 |
더미에서 양말을 효율적으로 페어링하려면 어떻게 해야 합니까? (0) | 2021.09.26 |
Git을 사용하여 마지막 X 커밋을 함께 스쿼시 (0) | 2021.09.26 |