【问题标题】:Types of collection收藏类型
【发布时间】:2013-09-03 03:23:38
【问题描述】:

我有一个包含杂项的数组。内容,我需要以某种方式生成一个新数组,该数组将在对应索引处保存数据类型,我尝试使用:

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

但它没有给我我所期望的...... 有没有办法生成这样的数组?

【问题讨论】:

  • 看看我的回答,我想这就是你可能要找的。​​span>

标签: javascript arrays typeof


【解决方案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 不是标准的,根据您声明函数的方式,可能没有任何可靠的方法可以找到函数的名称。

【讨论】:

  • 差不多了,看看类型检查fn,也许你可以改进一下。
  • ...如果它可以断言“特殊”情况下的对象会很棒。
  • 可能在运行 ctor.name 扫描的“对象”结果上?那样会做得更好吗?
  • @NikolaVukovic 特殊情况对象是什么意思?如果你总是使用命名函数作为构造函数,你应该能够解析对象的构造函数的名称。
  • 啊,好的,这是一个加分项。
【解决方案2】:

您的代码不起作用,因为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() 来完成同样的任务:)

【讨论】:

  • ... 或者您可以使用 shim Array.prototype.map 并使用方便的工具 ;-)
  • @zerkms 是的,你可以:)
【解决方案3】:
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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多