将javascript对象转换为数组.如何?

Jho*_*re- 21 javascript jquery

我做了这个沙箱测试:

<html>
    <head>
        <title>whatever</title>
        <script type="text/javascript">
            function myLittleTest() {
                var obj, arr, armap;

                arr = [1, 2, 3, 5, 7, 11];

                obj = {};
                obj = arr;
                alert (typeof arr);
                alert (typeof obj);

                // doesn't work in IE
                armap = obj.map(function (x) { return x * x; });
                alert (typeof armap);

            }
            myLittleTest();
        </script>
    </head>
    <body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我意识到我可以使用jQuery的函数$ .map来使这行代码工作,但是,我在javascript数据类型上缺少什么?

Sea*_*lan 57

如果你有一个类似数组的对象(arguments例如,),你可以通过调用得到一个真正的数组Array.prototype.slice.call(o).

var o = {0:"a", 1:'b', length:2};
var a = Array.prototype.slice.call(o);
Run Code Online (Sandbox Code Playgroud)

a会的["a", "b"].只有正确设置length属性才能正常工作.

  • 这方面的简写是`[] .slice.call()`.这是我从expressjs框架中学到的东西. (5认同)
  • 这有点浪费,每次需要从原型调用方法时创建一个新的数组? (3认同)

小智 24

我觉得你太努力了......

使用jQuery(或类似的库)最简单

对于这个对象:

var obj = {a: 1, b: 2, c: 3};
Run Code Online (Sandbox Code Playgroud)

数组有一个固定的密钥系统,所以对于上面的对象,你必须丢弃密钥(a,b,c)或值(1,2,3)

所以要么:

var arr = $.map(obj, function (value, key) { return value; });
Run Code Online (Sandbox Code Playgroud)

或这个:

var arr = $.map(obj, function (value, key) { return key; });
Run Code Online (Sandbox Code Playgroud)

  • 此方法将删除null"属性".在我的情况下,我需要数组计数和项目集合完全相同 (2认同)

Ada*_*ane 7

一年前,但我可能会提到jQuery的makeArray函数http://api.jquery.com/jQuery.makeArray/

  • `var t = {f:4,h:5}; var u = $ .makeArray(t);`u将是一个包含一个元素的数组:object t.我怀疑这是什么需要吗? (9认同)

Mik*_*rty 5

我很确定这不是类型问题,因为IE在Array.map()IE 9之前没有这个功能.请参阅http://msdn.microsoft.com/en-us/library/k4h76zbx(v=VS.85 ).aspx获取支持的函数列表.有关IE 9中函数的说明,请参见http://msdn.microsoft.com/en-us/library/ff679976(v=VS.94).aspxArray.map().


Pet*_*tai 5

使用for循环实现最大的浏览器兼容性.

在Javascript中,所有数组都是对象,但并非所有对象都是数组.看看这个Perfection Kills页面,它描述了如何检查某些东西是一个数组.

要检查阵列,您可以使用Object.prototype.toString.call(theObject).这将返回[object Array]一个Array [object Object]对象和一个不是Array的对象(参见下面的示例):

            function myLittleTest() 
            {
                var obj, arr, armap, i;    

                  // arr is an object and an array
                arr = [1, 2, 3, 5, 7, 11]; 

                obj = {}; // obj is only an object... not an array

                alert (Object.prototype.toString.call(obj));
                  // ^ Output: [object Object]

                obj = arr; // obj is now an array and an object

                alert (Object.prototype.toString.call(arr));
                alert (Object.prototype.toString.call(obj));
                  // ^ Output for both: [object Array]

                // works in IE
                armap = [];
                for(i = 0; i < obj.length; ++i)
                {
                    armap.push(obj[i] * obj[i]);
                }

                alert (armap.join(", ")); 

            }
            // Changed from prueba();
            myLittleTest();
Run Code Online (Sandbox Code Playgroud)

jsFiddle例子