【问题标题】:Converting a JS object to an array using jQuery使用 jQuery 将 JS 对象转换为数组
【发布时间】:2011-10-15 00:11:35
【问题描述】:

我的应用程序创建了一个 JavaScript 对象,如下所示:

myObj= {1:[Array-Data], 2:[Array-Data]}

但是我需要这个对象作为一个数组。

array[1]:[Array-Data]
array[2]:[Array-Data]

所以我尝试通过使用$.each 遍历对象并将元素添加到数组中来将此对象转换为数组:

x=[]
$.each(myObj, function(i,n) {
    x.push(n);});

有没有更好的方法将对象转换为数组或函数?

【问题讨论】:

  • 数组索引是否应该与原始对象中的键相同?数组中的第一个索引始终为 0,但您自己的代码和大多数答案(包括接受的答案)似乎都忽略了它;不过,您已将我的编辑恢复为所需的示例结果。
  • 是的,您是对的:第一个 Array 元素以 0 开头。但我恢复了您的编辑,因为在我看来,让该示例尽可能简单并不一致,因为将 myObj= {1:[Array-Data] 更改为 @ 987654327@ 不是您编辑的一部分(我没记错)
  • 对该api.jquery.com/jQuery.makeArray 使用jQuery $.makeArray(obj) 命令
  • @DevlshOne 您提供的文档说:“将 jQuery 对象转换为数组”我认为这不适合 OP 问题

标签: javascript jquery arrays object


【解决方案1】:

如果您正在寻找功能性方法:

var obj = {1: 11, 2: 22};
var arr = Object.keys(obj).map(function (key) { return obj[key]; });

结果:

[11, 22]

与 ES6 箭头函数相同:

Object.keys(obj).map(key => obj[key])

使用 ES7,您将能够使用 Object.values 代替 (more information):

var arr = Object.values(obj);

或者如果您已经在使用 Underscore/Lo-Dash:

var arr = _.values(obj)

【讨论】:

  • 对最佳答案不满意,我只是写了这个几乎完全一样的函数,回来发布它作为答案,向下滚动,看到 170。意识到,伙计,如果我没有放弃,我不会'不必考虑 :) 这应该在顶部。 OP请选择作为答案。
  • 对于不明显的任何人,键不需要是顺序的(即在本例中它们是 1 和 2 - 但它们也可以是字符串键或非顺序键号码
  • 对于第一段代码,我缺少分号。不知道为什么。
  • @JohnnyBizzle 我猜你的 linter 需要写“return obj[key];”最后用分号。 JavaScript 没有。
【解决方案2】:
var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

var array = $.map(myObj, function(value, index) {
    return [value];
});


console.log(array);

输出:

[[1, 2, 3], [4, 5, 6]]

【讨论】:

  • @Dogbert,你能解释一下$.map吗?我尝试对此进行的每一次搜索都会找到大量指向 jQuery 或数组的 map 方法的链接。
  • 天啊!忽略我的评论。我没有注意到这个问题上的 jQuery 标签。
  • 有没有办法维护新数组中的键?我看到的 www 上的每个答案都缺少键的转换。
  • 不使用 jQuery 也可以这样做:Object.keys(myObject).map(function(val) { return [val] });
  • @TD_Nijboer 是的,使用value.key = index; return [value]; 而不是return [value];
【解决方案3】:

简单地做

Object.values(obj);

就是这样!

【讨论】:

  • Object.values 是 ES2017 方法,Safari、IE、Node 6 不支持。
【解决方案4】:

我认为您可以使用for in,但检查该属性是否未注册

myObj= {1:[Array-Data], 2:[Array-Data]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
       arr.push(myObj[i]);
    }
}

编辑 - 如果您愿意,您还可以保留对象的索引,但您必须检查它们是否为数字(并且您会因缺少索引而获得未定义的值:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

myObj= {1:[1,2], 2:[3,4]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
        if (isNumber(i)){
            arr[i] = myObj[i];
        }else{
          arr.push(myObj[i]);
        }
    }
}

【讨论】:

  • 你应该已经测试了代码。 $.map 将变平 Array-Data
  • 你说得对,我没有用数组测试它,地图把它弄平了!我修改了答案
  • @Nicola Peluchetti $.makeArray() 听起来不错,但不是我想要的,因为它只是将对象放入数组元素:[{1:[Array-Data], 2:[Array-Data]}]$.map() 也没有看起来很成功。它将所有子数组数据合并到一个数组中。 array.length 应该返回 2(因为存在 2 个元素),但它返回 67,这是所有 ["Array-Data"] 中所有元素的数量。
  • @The Bndr 我发布了另一个解决方案,但您可以按照 dogbert 的建议使用地图
  • 我认为您必须明确指定数组索引...例如 arr[+i] = myObj[i]; 因为 (i) for(...in...) 不保证以任何顺序返回属性 (ii) 在 OP 的示例中属性从1,而不是 0。
【解决方案5】:

如果您知道对象中的最大索引,您可以执行以下操作:

var myObj = {
    1: ['c', 'd'],
    2: ['a', 'b']
  },
  myArr;

myObj.length = 3; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr); //[undefined, ['c', 'd'], ['a', 'b']]

【讨论】:

  • 生成对象的代码最好也设置长度或首先将其设为数组。我不认为两者都是可能的,所以这个答案对我没有帮助。
  • myObj.length = Object.keys(myObj).length
【解决方案6】:

由于 ES5 Object.keys() 返回一个数组,其中包含直接定义在对象上的属性(不包括原型链中定义的属性):

Object.keys(yourObject).map(function(key){ return yourObject[key] });

ES6 通过箭头函数更进一步:

Object.keys(yourObject).map(key => yourObject[key]);

【讨论】:

  • 对于当前的 ES5(虽然我确实喜欢 ES6): Object.keys(yourObject).map(function(key){ return yourObject[key] });
【解决方案7】:

现在,有一种简单的方法可以做到这一点:Object.values()

var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

console.log(Object.values(myObj));

输出:

[[1, 2, 3], [4, 5, 6]]

这不需要 jQuery,它已在 ECMAScript 2017 中定义。
每个现代浏览器都支持它(忘记 IE)。

【讨论】:

  • 如果我做类似var state = { ingredient: { salad: 1, bacon: 1, } } 然后var HariOm = Object.values(state); 后跟console.log(typeof HariOM) 它会将类型显示为对象。不应该显示为数组吗?
  • 这完全正常,请在此处查看参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 您可以使用Array.isArray(HariOM)
【解决方案8】:

最好的方法是使用仅限 javascript 的函数:

var myArr = Array.prototype.slice.call(myObj, 0);

【讨论】:

  • @Qwerty 哪个浏览器?
  • 铬。使用var myObj = {1:[1,2,3],2:[4,5,6]}; 测试
  • 请注意,此方法适用于转换“类数组对象”,这意味着它们必须具有“长度”属性和从 0 开始计数的枚举属性。因此,要使 @Qwerty 的示例工作试试这个:{0:[1,2,3],1:[4,5,6],长度:2}。尝试使用索引值和长度值,这有点宽松。这是有关该主题的好读物:nfriedly.com/techblog/2009/06/… 跳至“类数组对象”。
【解决方案9】:
x = [];
for( var i in myObj ) {
    x[i] = myObj[i];
}

【讨论】:

  • 你应该使用push,否则你最终可能会创建一个对象
  • 也许它是一些更好的力量来整合索引。 var bbb = {'1': 'a', '3': 'b'}; var x = []; for (var i in bbb) { x[parseInt(i)] = bbb[i];} console.log(x);
【解决方案10】:

ECMASCRIPT 5:

Object.keys(myObj).map(function(x) { return myObj[x]; })

ECMASCRIPT 2015 或 ES6:

Object.keys(myObj).map(x => myObj[x])

【讨论】:

    【解决方案11】:

    jQuery.makeArray(obj)怎么样

    这就是我在我的应用中的做法。

    【讨论】:

    • 这将返回上述示例的 [Object]。
    • 只需添加 [0] 索引,您就救了我的命 :)
    【解决方案12】:

    ES8 方式 变得简单

    The official documentation

        const obj = { x: 'xxx', y: 1 };
        let arr = Object.values(obj); // ['xxx', 1]
        console.log(arr);

    【讨论】:

      【解决方案13】:

      解决方法很简单

      var my_obj = {1:[Array-Data], 2:[Array-Data]}
      Object.keys(my_obj).map(function(property_name){ 
          return my_obj[property_name]; 
      });
      

      【讨论】:

        【解决方案14】:

        Fiddle Demo

        bjornd 答案的扩展。

        var myObj = {
            1: [1, [2], 3],
            2: [4, 5, [6]]
        }, count = 0,
            i;
        //count the JavaScript object length supporting IE < 9 also
        for (i in myObj) {
            if (myObj.hasOwnProperty(i)) {
                count++;
            }
        }
        //count = Object.keys(myObj).length;// but not support IE < 9
        myObj.length = count + 1; //max index + 1
        myArr = Array.prototype.slice.apply(myObj);
        console.log(myArr);
        


        参考

        Array.prototype.slice()

        Function.prototype.apply()

        Object.prototype.hasOwnProperty()

        Object.keys()

        【讨论】:

        • 我可能是错的,但是 myObj 从 0 开始是一个可枚举的对象会更好吗?否则,在我看来,我们的数组存在问题:[undefined,[1,[2],3]](第一部分未定义,因为它找不到 myObj['0']最后一部分 myObj['2'] 被弹出,因为在读取 .length 后它停在 myObj['1']?
        【解决方案15】:

        如果要将对象属性的名称保留为值。示例:

        var fields = {
            Name: { type: 'string', maxLength: 50 },
            Age: { type: 'number', minValue: 0 }
        }
        

        使用Object.keys()Array.map()Object.assign()

        var columns = Object.keys( fields ).map( p => Object.assign( fields[p], {field:p} ) )
        

        结果:

        [ { field: 'Name', type: 'string', maxLength: 50 }, 
          { field: 'Age', type: 'number', minValue: 0 } ]
        

        解释:

        Object.keys() 枚举源的所有属性; .map()=&gt; 函数应用于每个属性并返回一个 Array ; Object.assign() 合并每个属性的名称和值。

        【讨论】:

          【解决方案16】:

          我做了一个自定义函数:

              Object.prototype.toArray=function(){
              var arr=new Array();
              for( var i in this ) {
                  if (this.hasOwnProperty(i)){
                      arr.push(this[i]);
                  }
              }
              return arr;
          };
          

          【讨论】:

            【解决方案17】:

            经过一些测试,这是一个通用的对象到数组函数转换器:

            你有对象:

            var obj = {
                some_key_1: "some_value_1"
                some_key_2: "some_value_2"
            };
            

            功能:

            function ObjectToArray(o)
            {
                var k = Object.getOwnPropertyNames(o);
                var v = Object.values(o);
            
                var c = function(l)
                {
                    this.k = [];
                    this.v = [];
                    this.length = l;
                };
            
                var r = new c(k.length);
            
                for (var i = 0; i < k.length; i++)
                {
                    r.k[i] = k[i];
                    r.v[i] = v[i];
                }
            
                return r;
            }
            

            功能使用:

            var arr = ObjectToArray(obj);
            

            你得到:

            arr {
                key: [
                    "some_key_1",
                    "some_key_2"
                ],
                value: [
                    "some_value_1",
                    "some_value_2"
                ],
                length: 2
            }
            

            那么您就可以访问所有键和值,例如:

            for (var i = 0; i < arr.length; i++)
            {
                console.log(arr.key[i] + " = " + arr.value[i]);
            }
            

            控制台中的结果:

            some_key_1 = some_value_1
            some_key_2 = some_value_2
            

            编辑:

            或原型形式:

            Object.prototype.objectToArray = function()
            {
                if (
                    typeof this != 'object' ||
                    typeof this.length != "undefined"
                ) {
                    return false;
                }
            
                var k = Object.getOwnPropertyNames(this);
                var v = Object.values(this);
            
                var c = function(l)
                {
                    this.k = [];
                    this.v = [];
                    this.length = l;
                };
            
                var r = new c(k.length);
            
                for (var i = 0; i < k.length; i++)
                {
                    r.k[i] = k[i];
                    r.v[i] = v[i];
                }
            
                return r;
            };
            

            然后使用like:

            console.log(obj.objectToArray);
            

            【讨论】:

              【解决方案18】:

              您可以创建一个简单的函数来执行从objectarray 的转换,这样的事情可以使用纯javascript 为您完成这项工作:

              var objectToArray = function(obj) {
                var arr = [];
                if ('object' !== typeof obj || 'undefined' === typeof obj || Array.isArray(obj)) {
                  return obj;
                } else {
                  Object.keys(obj).map(x=>arr.push(obj[x]));
                }
                return arr;
              };
              

              或者这个:

              var objectToArray = function(obj) {
                var arr =[];
                for(let o in obj) {
                  if (obj.hasOwnProperty(o)) {
                    arr.push(obj[o]);
                  }
                }
                return arr;
              };
              

              并调用和使用如下函数:

              var obj = {1:'a', 2:'b', 3:'c', 4:'d', 5:'e'};
              objectToArray(obj); // return ["a", "b", "c", "d", "e"]
              

              未来我们还会有一个叫做Object.values(obj)的东西,类似于Object.keys(obj),它将为你返回一个数组的所有属性,但在许多浏览器中还不支持......

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-11-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多