2012-07-30 43 views
5

我知道在JavaScript中,有时候系统会创建一个假数组,这意味着它实际上是一个对象而不是Array的一个实例,但仍然具有部分功能数组。例如,你在函数内部得到的arguments变量是由系统创建的一个假数组。在这种情况下,我知道,把它变成一个真正的数组,你可以这样做:将由我创建的假数组转换为真正的数组,使用JavaScript

var realArray = Array.prototype.slice.call(fakeArray); 

但是,如果伪阵列不是由系统创建的,要是fakeArray很干脆:

var fakeArray = { "0": "some value", "1": "another value" }; 

在这种情况下,我测试了它,使用上面的方法将导致一个空数组。我希望能够像我在我给的例子(由我而不是由系统创建的)中将假数组变成真实数组。在你告诉我从一开始就把假数组变成一个真正的数组之前,你应该知道我从一个我无法控制的资源中获取假数组。

那么,如何将未由系统创建的假数组转换为真实数组?

+1

你试过到'length'属性添加到对象?我相信几乎所有'Array。*'修改都使用数组的长度。 – Zeta 2012-07-30 14:01:46

+2

@Elias Van Ootegem你显然没有读完我的整个问题。 – Cokegod 2012-07-30 14:03:49

+0

@EliasVanOotegem为什么不在问问题之前先回答问题? – 2012-07-30 14:04:01

回答

5

你的例子将适用于如果你的“假阵列”被赋予适当设置的.length属性。

这在某些旧版本的Internet Explorer中不起作用。


“开启伪阵列成为一个真正的数组的目的之一是获得它的长度”如果你想在对象属性的数量

,使用Object.keys ...

var len = Object.keys(fakeArray).length; 

匀场Object.keys对旧版浏览器,你可以做到这一点...

if (!Object.keys) { 
    Object.keys = function(o) { 
     var keys = []; 
     for (var k in o) 
      if (o.hasOwnProperty(k)) 
       keys.push(k) 
     return keys; 
    }; 
} 

如果伪阵列是“疏”,你会喜欢@Rocket显示需要的解决方案。

+0

很酷,那确实有用。整齐! :-) – 2012-07-30 14:03:27

+0

如果假数组是一个像nodelist这样的主机对象,它将不能在IE的旧版本中工作(*“Array.prototype.slice:'this'不是JavaScript对象”*) – Esailija 2012-07-30 14:04:07

+0

谢谢,虽然我真的不喜欢为旧浏览器创建低效的回退,但我想你必须这样做...... – Cokegod 2012-07-30 14:10:23

3

您只需简单地遍历“数组”即可将值保存到实数组中。

var fakeArray = { "0": "some value", "1": "another value" }; 
var realArray = []; 

for(var i in fakeArray){ 
    realArray[i] = fakeArray[i]; 
} 
+0

你打我一分钟;)+1 – rsplak 2012-07-30 14:04:53

+1

@rsplak:伟大的头脑都认为一样。 – 2012-07-30 14:05:15

+1

+1我认为这将是更好的整体,因为'.length'不知道。 – 2012-07-30 14:14:19

0

可以遍历对象属性,同时推动你想要的那些到新阵列:

var array = []; 

for (var i in fakeArray) if (fakeArray.hasOwnProperty(i)) { 
    array.push(fakeArray[i]); 
}