2007年10月12日

javascriptのオブジェクトが配列かどうかを調べる関数 このエントリーをはてなブックマークに追加

こんにちは、三宅久之です(嘘です)。

javascript のオブジェクトが配列かどうかをチェックする関数が下記に紹介されていたので試してみた。

サンプルコードは下記のよーな感じ。


<html>
<head>
<script type="text/javascript">
<!--
function IsArray(array)
{
  return !(
    !array || 
    (!array.length || array.length == 0) || 
    typeof array !== 'object' || 
    !array.constructor || 
    array.nodeType || 
    array.item 
  );
}

// examples
function check_array(){
    alert( IsArray( [] ) ); // true ← falseになる?
    alert( IsArray( [1,2,3] ) ); // true
    alert( IsArray( {a:1} ) ); // false
    alert( IsArray( document.forms[0] ) ); // false
    alert( IsArray( [document.forms[0]] ) ); // true
}
// -->
</script>
</head>
<body onload="check_array()";>
</body>
</html>



で、喜び勇んでやってみたら、どーも、

    alert( IsArray( [] ) );

の部分がtrueではなくfalseになるっぽい。

うーむ。正しい?
posted by りょーち | Comment(9) | TrackBack(0) | Web周辺技術
この記事へのコメント
こうしてはどうでしょう?

function IsArray(array) {
  return (typeof(array) == "object" &&
    array.constructor.toString().indexOf(" Array(") > 0);
}
Posted by SSKScript at 2008年03月18日 18:52
ぬるぽ check を忘れてました・・・ f-_-;

function IsArray(array) {
  return (typeof(array) == "object" && array != null &&
    array.constructor.toString().indexOf(" Array(") >= 0);
}
Posted by SSKScript at 2008年03月18日 20:25
IE6 と Firefox で true, true, false, false, true いけました。
これが最終版であることを祈ります・・・

function IsArray(array) {
  return (typeof(array) == "object" && array != null &&
    typeof(array.constructor) == "function" &&
    array.constructor.toString().indexOf(" Array(") >= 0);
}
Posted by SSKScript at 2008年03月18日 20:56
上記リンク先にも、訂正コメントが付いてるようですね・・・
短縮して書くと、こうかな?

function IsArray(array) {
  return !!(array && array.constructor &&
    array.constructor.toString().indexOf(" Array(") >= 0);
}

お騒がせしました。
Posted by SSKScript at 2008年03月18日 22:04
迂闊でした

var ary = new Array();
if (ary instanceof Array) { ...

instanceof 演算子の存在を忘れてました・・・ ○| ̄|_
Posted by SSKScript at 2008年03月19日 00:34
SSKSscriptさん、こんにちは。
りょーち@管理人です。
コメントいただきましてありがとうございます。
Javascriptについて、あまり詳しくないのですが、22:04に記載いただいたものと00:34に記載いただいたものではどう違うのでしょう?
22:04バージョンではよろしくないのでしょうか?
22:04バージョンではサンプルプログラムは期待通りの結果を返しているようです。
Posted by りょーちりょーち at 2008年03月19日 10:56
↓これじゃだめでしょうか?
var a = []
alert(a.constructor===Array)

他のobjectの場合
var b = {}
alert(b.constructor===Object)
var f = function(){}
alert(f.constructor===Function)
Posted by cyokodog at 2008年05月20日 21:47
cyokodogさんこんにちは。りょーち@管理人です。
コメントいただきましてありがとうございます。

うーむ。素晴らしいです。javascriptをあまり理解できていないので、技術的な言及ができないのですが、
--------
function IsArray(a){
return(a.constructor===Array);
}
--------
って感じでよさそうなんですねぇ。
constructorってのがよくわかってないので、今度よくしらべてみます。
いただいた例を拝見するかぎりでは、大本のオブジェクトが何者かってのを調べることができるんですねー。
すばらしすぎます。

更に勉強してみます。ありがとうございました。
Posted by りょーち at 2008年05月21日 16:37
かなり過去のものにコメントしてすいませんが、
IsArray=Array.isArray;
としてみては
Posted by at 2014年02月24日 23:33
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: