有没有办法防止字符串表现得像多维数组?

时间:2014-12-18 18:28:49

标签: javascript arrays string multidimensional-array

我的问题是我有一些代码来检查数组是否是多维的。

if( typeof( ary[ 0 ][ 0 ] ) != 'undefined' )
{
    alert( "this array is 2 dimensional" );
}
else
{   
    alert( "this array is not 2 dimensional" )
}

这适用于仅包含数字的数组。但是当我的数组充满了像

这样的字符串时
var ary = [ "one", "two", "three" ];

JavaScript似乎使这个数组具有固有的多维性。我可以通过以下方式访问每个字母:

alert( ary[ 0 ][ 0 ] );//This returns the letter "o" from "one"

问题是typeof的{​​{1}}未定义,但它是一个字符串。那么如果我的数组不是真正的二维,我如何才能使这个返回未定义?是的我是新手和thx。

3 个答案:

答案 0 :(得分:3)

  

有没有办法防止字符串表现得像多维数组?

你不能改变字符串的行为,不,但该测试也可以解决其他问题。例如,它会说这是一个二维数组:

var obj = {0: {0: "foo"}}; // Yes, that's valid syntax. Rare, but valid.

相反,请考虑Array.isArray

if (Array.isArray(ary) && Array.isArray(ary[0]))
{
    alert( "this array is 2 dimensional" );
}
else
{   
    alert( "this array is not 2 dimensional" )
}
在ES5中添加了

Array.isArray,但对于真正的旧引擎可以轻松填充:

if (!Array.isArray) {
    (function() {
        var toString = Object.prototype.toString;
        Array.isArray = function(arg) {
            return toString.call(arg) === "[object Array]";
        };
    })();
}

旁注:JavaScript没有拥有多维数组。它有数组,可以包含其他数组。仅仅因为索引0处的数组并不意味着索引1处有一个数组。

答案 1 :(得分:3)

使用Array.isArray来检查对象是否是多维数组:

if (Array.isArray(ary) && Array.isArray(ary[0])) { ... }

请注意,Array.isArray是ES5的补充,但如果您需要支持旧浏览器,则jQuery具有$.isArray,而lodash / underscore.js具有_.isArray。如果你没有使用其中任何一种,MDN有以下polyfill:

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

答案 2 :(得分:0)

你也可以使用像lodash这样的库。

检查此功能https://lodash.com/docs#isArray

E.g。

if (_.isArray(ary) && _.isArray(ary[0]))
{
  alert( "this array is 2 dimensional" );
}
else
{   
  alert( "this array is not 2 dimensional" )
}