문자열 목록 또는 단일 문자열을 허용하는 함수를 작성하려고 합니다. 문자열인 경우 오류에 대한 두려움 없이 반복할 수 있도록 항목이 하나만 있는 배열로 변환하고 싶습니다.
그렇다면 변수가 배열인지 어떻게 확인합니까?
질문자 :mpen
문자열 목록 또는 단일 문자열을 허용하는 함수를 작성하려고 합니다. 문자열인 경우 오류에 대한 두려움 없이 반복할 수 있도록 항목이 하나만 있는 배열로 변환하고 싶습니다.
그렇다면 변수가 배열인지 어떻게 확인합니까?
Object 의 클래스를 찾기 위해 ECMAScript 표준에서 주어진 방법은 Object.prototype
toString
방법을 사용하는 것입니다.
if(Object.prototype.toString.call(someVar) === '[object Array]') { alert('Array!'); }
typeof
를 사용하여 문자열 인지 테스트할 수 있습니다.
if(typeof someVar === 'string') { someVar = [someVar]; }
또는 성능에 대해 걱정하지 않는 경우 새 빈 배열에 concat
someVar = [].concat(someVar);
직접 쿼리할 수 있는 생성자도 있습니다.
if (somevar.constructor.name == "Array") { // do something }
아래 댓글에 게시된 TJ Crowder의 블로그에서 철저한 치료 를 확인하세요.
이 벤치마크 를 확인하여 어떤 방법이 더 잘 수행되는지 아이디어를 얻으십시오. http://jsben.ch/#/QgYAV
@Bharath 에서 다음 질문에 대해 ES6 을 사용하여 문자열을 배열로 변환합니다.
const convertStringToArray = (object) => { return (typeof object === 'string') ? Array(object) : object }
가정하다:
let m = 'bla' let n = ['bla','Meow'] let y = convertStringToArray(m) let z = convertStringToArray(n) console.log('check y: '+JSON.stringify(y)) . // check y: ['bla'] console.log('check y: '+JSON.stringify(z)) . // check y: ['bla','Meow']
최신 브라우저에서는 다음을 수행할 수 있습니다.
Array.isArray(obj)
( 지원 크롬 5, 파이어 폭스 4.0, 인터넷 익스플로러 9, 오페라 10.5 사파리 5)
이전 버전과의 호환성을 위해 다음을 추가할 수 있습니다.
// Only implement if no native implementation is available if (typeof Array.isArray === 'undefined') { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } };
jQuery를 사용하는 경우 jQuery.isArray(obj)
또는 $.isArray(obj)
사용할 수 있습니다. Underscore.js 를 사용하는 경우 _.isArray(obj)
사용할 수 있습니다.
다른 프레임에서 생성된 배열을 감지할 필요가 없다면 instanceof
를 사용할 수도 있습니다.
obj instanceof Array
isArray
지원하는지 확인합니다.
if (Array.isArray) return Array.isArray(v);
instanceof
연산자를 사용해 볼 수도 있습니다.
v instanceof Array
$.isArray()
메서드도 제공합니다.
var a = ["A", "AA", "AAA"]; if($.isArray(a)) { alert("a is an array!"); } else { alert("a is not an array!"); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
이것은 모든 방법 중에서 가장 빠릅니다(모든 브라우저 지원).
function isArray(obj){ return !!obj && obj.constructor === Array; }
다음과 같은 배열 이 있다고 상상해보십시오.
var arr = [1,2,3,4,5];
JavaScript(신규 및 이전 브라우저):
function isArray(arr) { return arr.constructor.toString().indexOf("Array") > -1; }
또는
function isArray(arr) { return arr instanceof Array; }
또는
function isArray(arr) { return Object.prototype.toString.call(arr) === '[object Array]'; }
그런 다음 다음과 같이 호출합니다.
isArray(arr);
JavaScript(Internet Explorer 9 이상, Chrome 5 이상, Firefox 4 이상, Safari 5 이상 및 Opera 10.5 이상)
Array.isArray(arr);
제이쿼리:
$.isArray(arr);
모난:
angular.isArray(arr);
Underscore.js 및 Lodash :
_.isArray(arr);
Array.isArray는 빠르게 작동하지만 모든 버전의 브라우저에서 지원되는 것은 아닙니다.
따라서 다른 사람들을 위해 예외를 만들고 보편적인 방법을 사용할 수 있습니다.
Utils = {}; Utils.isArray = ('isArray' in Array) ? Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; }
이것을 확인하는 간단한 함수:
function isArray(object) { return object.constructor === Array; }
이 질문에 대한 단 한 줄의 솔루션이 있습니다.
x instanceof Array
여기서 x는 변수이며 x가 배열이면 true를 반환하고 그렇지 않으면 false를 반환합니다.
MDN 이 여기에서 말했듯이 :
Array.isArray 또는 Object.prototype.toString.call 을 사용하여 일반 객체를 배열과 구별하십시오.
이와 같이:
Object.prototype.toString.call(arr) === '[object Array]'
또는
Array.isArray(arr)
변수의 유형이 배열인지 여부를 확인할 수 있습니다.
var myArray=[]; if(myArray instanceof Array) { .... }
나는 당신이 다루고있는 객체의 유형을 테스트하는 함수를 만들 것입니다 ...
function whatAmI(me){ return Object.prototype.toString.call(me).split(/\W/)[2]; } // tests console.log( whatAmI(["aiming","@"]), whatAmI({living:4,breathing:4}), whatAmI(function(ing){ return ing+" to the global window" }), whatAmI("going to do with you?") ); // output: Array Object Function String
그러면 간단한 if 문을 작성할 수 있습니다 ...
if(whatAmI(myVar) === "Array"){ // do array stuff } else { // could also check `if(whatAmI(myVar) === "String")` here to be sure // do string stuff }
나는 이것을 아주 간단한 방법으로 한다. 그것은 나를 위해 작동합니다.
Array.prototype.isArray = true; a=[]; b={}; a.isArray // true b.isArray // (undefined -> false)
이것은 의견을 고려하여 이 답변 을 개선하려는 시도입니다.
var isArray = myArray && myArray.constructor === Array;
if/else를 제거하고 배열이 null이거나 정의되지 않을 가능성을 고려합니다.
두 가지 대체 방법과 오류 검사로 jsperf 바이올린 을 업데이트했습니다.
'Object' 및 'Array' 프로토타입에서 상수 값을 정의하는 방법이 다른 방법보다 빠릅니다. 다소 의외의 결과입니다.
/* Initialisation */ Object.prototype.isArray = function() { return false; }; Array.prototype.isArray = function() { return true; }; Object.prototype._isArray = false; Array.prototype._isArray = true; var arr = ["1", "2"]; var noarr = "1"; /* Method 1 (function) */ if (arr.isArray()) document.write("arr is an array according to function<br/>"); if (!noarr.isArray()) document.write("noarr is not an array according to function<br/>"); /* Method 2 (value) - **** FASTEST ***** */ if (arr._isArray) document.write("arr is an array according to member value<br/>"); if (!noarr._isArray) document.write("noarr is not an array according to member value<br/>");
이 두 가지 방법은 변수가 정의되지 않은 값을 취하는 경우 작동하지 않지만 값이 있는 것이 확실한 경우 작동합니다. 성능을 염두에 두고 값이 배열인지 단일 값인지 확인하는 것과 관련하여 두 번째 방법은 유효한 빠른 방법처럼 보입니다. Chrome의 'instanceof'보다 약간 빠르며 Internet Explorer, Opera 및 Safari(내 컴퓨터)에서 두 번째로 좋은 방법보다 두 배 빠릅니다.
사람들이 일종의 원시 JavaScript 접근 방식을 찾고 있다는 것을 알고 있습니다. 그러나 그것에 대해 덜 생각하고 싶다면 Underscore.js의 isArray를 살펴보십시오.
_.isArray(object)
객체 가 배열이면 true를 반환합니다.
(function(){ return _.isArray(arguments); })(); => false _.isArray([1,2,3]); => true
Array.isArray() 사용할 수 있습니다. 다음은 폴리필입니다.
if (Array.isArray == null) { Array.isArray = (arr) => Object.prototype.toString.call(arr) === "[object Array]" }
가장 좋은 방법은 다음과 같은 constructor
if(some_variable.constructor === Array){ // do something }
typeOf
와 같은 다른 방법도 사용할 수 있습니다. 이를 문자열로 변환한 다음 비교할 수 있지만 dataType과 비교하는 것이 항상 더 나은 방법입니다.
이 함수에 전달할 수 있는 값이 문자열 또는 문자열 배열뿐인 경우 단순하게 유지하고 문자열 가능성에 대해 typeof
function someFunc(arg) { var arr = (typeof arg == "string") ? [arg] : arg; }
내 게으른 접근 방식은 다음과 같습니다.
if (Array.prototype.array_ === undefined) { Array.prototype.array_ = true; } // ... var test = [], wat = {}; console.log(test.array_ === true); // true console.log(wat.array_ === true); // false
프로토타입을 "장난"하는 것이 신성모독이라는 것을 알고 있지만 toString
메서드보다 훨씬 더 나은 성능을 발휘하는 것으로 보입니다 .
참고: 이 접근 방식의 함정은 iframe
경계를 넘어 작동 하지 않는다는 것입니다. 그러나 제 사용 사례에서는 이것이 문제가 되지 않습니다.
이 함수는 거의 모든 것을 배열로 바꿉니다.
function arr(x) { if(x === null || x === undefined) { return []; } if(Array.isArray(x)) { return x; } if(isString(x) || isNumber(x)) { return [x]; } if(x[Symbol.iterator] !== undefined || x.length !== undefined) { return Array.from(x); } return [x]; } function isString(x) { return Object.prototype.toString.call(x) === "[object String]" } function isNumber(x) { return Object.prototype.toString.call(x) === "[object Number]" }
일부 최신 브라우저 기능을 사용하므로 최대 지원을 위해 이를 폴리필(Polyfill)할 수 있습니다.
예:
> arr(null); [] > arr(undefined) [] > arr(3.14) [ 3.14 ] > arr(1/0) [ Infinity ] > gen = function*() { yield 1; yield 2; yield 3; } [Function: gen] > arr(gen()) [ 1, 2, 3 ] > arr([4,5,6]) [ 4, 5, 6 ] > arr("foo") [ 'foo' ]
NB 문자열은 문자 배열 대신 단일 요소가 있는 배열로 변환됩니다. isString
원하는 경우 isString 검사를 삭제하십시오.
여기에서 Array.isArray
사용 했는데 가장 강력 하고 간단하기 때문입니다.
객체에 concat 메서드가 없다는 것을 알고 있는 경우 다음을 사용할 수 있습니다.
var arr = []; if (typeof arr.concat === 'function') { console.log("It's an array"); }
var a = [], b = {}; console.log(a.constructor.name == "Array"); console.log(b.constructor.name == "Object");
내가 본 최고의 솔루션은 typeof에 대한 브라우저 간 대체입니다. Angus Croll의 솔루션을 확인하십시오.
TL;DR 버전은 아래에 있지만 기사는 문제에 대한 훌륭한 토론이므로 시간이 있으면 읽어야 합니다.
Object.toType = function(obj) { return ({}).toString.call(obj).match(/\s([az|AZ]+)/)[1].toLowerCase(); } // ... and usage: Object.toType([1,2,3]); //"array" (all browsers) // or to test... var shouldBeAnArray = [1,2,3]; if(Object.toType(shouldBeAnArray) === 'array'){/* do stuff */};
Stoyan Stefanov의 책 JavaScript Patterns 에는 가능한 모든 문제를 처리하고 ECMAScript 5 메서드 Array.isArray() 를 사용해야 하는 좋은 예가 있습니다.
여기 있습니다:
if (typeof Array.isArray === "undefined") { Array.isArray = function (arg) { return Object.prototype.toString.call(arg) === "[object Array]"; }; }
그건 그렇고, jQuery를 사용하는 경우 $.isArray() 메서드를 사용할 수 있습니다.
isArray 메서드를 사용할 수 있지만 다음과 같이 확인하고 싶습니다.
Object.getPrototypeOf(yourvariable) === Array.prototype
function isArray(value) { if (value) { if (typeof value === 'object') { return (Object.prototype.toString.call(value) == '[object Array]') } } return false; } var ar = ["ff","tt"] alert(isArray(ar))
입력 값이 배열인지 테스트하는 간단한 함수는 다음과 같습니다.
function isArray(value) { return Object.prototype.toString.call(value) === '[object Array]'; }
이것은 브라우저 간 및 이전 브라우저에서 작동합니다. 이것은 TJ Crowders의 블로그 게시물에서 가져온 것입니다.
당신은 이것을 시도할 수 있습니다:
var arr = []; (or) arr = new Array(); var obj = {}; (or) arr = new Object(); arr.constructor.prototype.hasOwnProperty('push') //true obj.constructor.prototype.hasOwnProperty('push') // false
귀하의 경우 단일 객체와 배열 (심지어 결합)을 허용 할 수 있는 Array의 concat
메소드를 사용할 수 있습니다.
function myFunc(stringOrArray) { var arr = [].concat(stringOrArray); console.log(arr); arr.forEach(function(item, i) { console.log(i, "=", item); }) } myFunc("one string"); myFunc(["one string", "second", "third"]);
concat
은 Array의 가장 오래된 방법 중 하나인 것 같습니다(IE 5.5도 잘 알고 있습니다).
출처 : http:www.stackoverflow.com/questions/4775722/how-can-i-check-if-an-object-is-an-array
"namespace std를 사용 중"인 이유는 무엇입니까? 나쁜 습관으로 간주됩니까? (0) | 2021.10.09 |
---|---|
참조로 변수를 전달하는 방법은 무엇입니까? (0) | 2021.10.09 |
Git 리포지토리에서 삭제된 파일을 찾고 복원하는 방법 (0) | 2021.10.09 |
명시적 키워드는 무엇을 의미합니까? (0) | 2021.10.09 |
__str__과 __repr__의 차이점은 무엇입니까? (0) | 2021.10.09 |