2014-12-18 1 views
1

Моя проблема заключается в том, что у меня есть код, чтобы проверить, является ли массив многомерным или нет.Есть ли способ предотвратить появление струн в виде многомерных массивов?

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 из ary[ 0 ][ 0 ] не определен, но это строка. Итак, как я могу сделать это возвращение неопределенным, если мой массив не является по-настоящему 2-мерным? Да, я новичок и thx.

+1

Well 'typeof ary [0]' будет 'string' не' object', с одной стороны. – Pointy

ответ

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") 
} 

Array.isArray был добавлен в ES5, но может быть легко подкладки для очень старых двигателей:

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

Side Примечание: 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]'; 
    }; 
} 
0

Вы также можете использовать библиотеки как lodash.

Проверить эту функцию https://lodash.com/docs#isArray

Э.Г.

if (_.isArray(ary) && _.isArray(ary[0])) 
{ 
    alert("this array is 2 dimensional"); 
} 
else 
{ 
    alert("this array is not 2 dimensional") 
} 
Смежные вопросы