【问题标题】:Cast javascript object to array. How to?将 javascript 对象转换为数组。如何?
【发布时间】:2011-04-21 09:03:37
【问题描述】:

我做了这个沙盒测试:

<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>

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

【问题讨论】:

  • 我不太确定你想要完成什么。你想要一个数组,其中每个索引代表一个来自和对象的属性吗?还是一个对象,其中每个属性都代表数组中的一个值?
  • 对于数组,您总是会从 typeof 获得 object。数组只是具有数字属性、一些额外方法和一个神奇的length 属性的对象。

标签: javascript jquery


【解决方案1】:

如果您有一个类似数组的对象(例如arguments),您可以通过调用Array.prototype.slice.call(o) 来获得一个由它组成的真实数组。

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

a 将是 ["a", "b"]。只有正确设置了 length 属性,这才会正常工作。

【讨论】:

  • +1 - 这也是复制arguments 数组的好方法,因为arguments.slice() 不适用于arguments... 而= arguments 则无效有帮助。 jsfiddle.net/SMayA
  • 这方面的简写是[].slice.call()。这是我从 expressjs 框架中学到的。
  • 这有点浪费,每次需要从原型调用方法时都创建一个新数组?
  • 结果数组是否只包含符合myobject.hasOwnProperty(mykey) 条件的元素?
  • @ThorSummoner:我不这么认为,但我认为它只会复制数字属性。如果你从原型继承数字属性,我认为你太聪明了。
【解决方案2】:

我觉得你太努力了……

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

对于这个对象:

var obj = {a: 1, b: 2, c: 3};

数组具有固定的键系统,因此对于上述对象,您必须丢弃键 (a, b, c) 或值 (1, 2, 3)

所以要么这样:

var arr = $.map(obj, function (value, key) { return value; });

或者这个:

var arr = $.map(obj, function (value, key) { return key; });

【讨论】:

  • 此方法将删除空“属性”。在我的情况下,我需要数组计数和项目集合完全相等
【解决方案3】:

一年前的现在,不过我不妨提一下jQuery的makeArray函数http://api.jquery.com/jQuery.makeArray/

【讨论】:

  • var t = {f: 4, h: 5}; var u = $.makeArray(t); u 将是一个包含一个元素的数组:对象 t。我怀疑这就是这里所需要的?
  • 哇,贾尼斯,你是对的。这到底是什么意思?为什么不直接说 [t]?!?
  • Janis,我花了一些时间才意识到与调试器一起工作……你说得对。
【解决方案4】:

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

【讨论】:

【解决方案5】:

使用for 循环以获得最大的浏览器兼容性。

在 Javascript 中,所有数组都是对象,但并非所有对象都是数组。看看 this Perfection Kills page,它描述了如何检查某个东西是否是一个数组。

要检查数组,您可以使用Object.prototype.toString.call(theObject)。这将为数组对象返回 [object Array],为非数组对象返回 [object Object](参见下面的示例):

            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();

jsFiddle example

【讨论】:

    【解决方案6】:

    在许多其他用于操作对象和数组的小型实用程序中,Underscore.js 提供了一个 toArray(obj) 辅助方法。此处的文档:http://underscorejs.org/#toArray

    从文档的编写方式来看,这并不是很明显,但它对任意对象的作用就像一个魅力。当给定一个对象时,它会遍历这些值并返回一个仅包含这些值的列表。

    【讨论】:

      猜你喜欢
      • 2015-01-13
      • 2015-12-10
      • 2019-10-22
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2021-01-15
      相关资源
      最近更新 更多