2013-09-03 3 views
0

У меня есть массив, содержащий разное. содержание, и мне нужно каким-то образом создать новый массив, который будет содержать типы данных в coresponding индекса, я попытался с помощью:Типы коллекции

typeof (["my", "misc", new Data]), 

, но это дает мне не то, что я ожидал ... Есть способ генерировать такой массив?

+0

Посмотрите на мой ответ, я думаю, что это то, что вы можете искать. – plalx

ответ

1

Этого можно достичь с помощью функции map.

var types = ["my", "misc", new Data].map(function (item) { 
    return typeof item; 
}); 

Однако, я думаю, что это может быть то, что вы ищете:

var types = ["my", "misc", new Data].map(function (item) { 
    var name = item.constructor && item.constructor.name; 
    return name? name: typeof item; 
}); 

Пожалуйста, обратите внимание, что Function.name не является стандартным и в зависимости от того, как вы объявили о своей функции, не может быть любой надежный способ найти имя функции.

+0

Это довольно близко, посмотрите на проверку типа fn, возможно, вы как-нибудь сможете ее улучшить. –

+0

... было бы здорово, если бы оно могло утверждать «специальный» случай objs. –

+0

как, например, на «объекте», выполняющем проверку ctor.name? будет ли это лучше? –

1

Ваш код не работает, потому что typeof не работает в контексте массива, он просто вернет тип вашего массива, который равен object.

решение

Поперечное браузер, чтобы построить новый массив с типом каждого соответствующего элемента исходного массива:

var arr = ["my", "misc", new Data()]; 

var types = []; 
for (var i = 0; i < arr.length; ++i) { 
    types.push(typeof(arr[i])); 
} 

В качестве альтернативы, вы можете использовать Array.map() для выполнения той же используя один вкладыш:)

+0

... или вы можете пропустить 'Array.prototype.map' и использовать удобные инструменты вместо ;-) – zerkms

+0

@zerkms Да, вы можете :) –

0
function type(o) { 
    var out = typeof o; 
    (
    (
     out = 
     (o && o.constructor === window.constructor) && 'window' 
     || ((Object.prototype.toString.call(o)).match(/\b(\w+)\]$/))[1].toLowerCase() 
    ) === 'number' 
    ) 
    && (isNaN(o) && (out = 'NaN')); 
    return out; 
} 
Смежные вопросы