首页 文章

使用jQuery将JS对象转换为数组

提问于
浏览
406

我的应用程序创建了一个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);});

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

18 回答

  • 3
    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]]
    
  • 13

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

    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.valuesmore information):

    var arr = Object.values(obj);
    

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

    var arr = _.values(obj)
    
  • 730

    我想你可以使用 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]);
            }
        }
    }
    
  • 15

    简单地做

    Object.values(obj);
    

    就这样!

  • 1

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

    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']]
    
  • 0

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

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

    ES6通过箭头功能更进一步:

    Object.keys(yourObject).map(key => yourObject[key]);
    
  • 15
    x = [];
    for( var i in myObj ) {
        x[i] = myObj[i];
    }
    
  • 24

    最好的方法是使用javascript -only函数:

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

    ECMASCRIPT 5:

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

    ECMASCRIPT 2015 or ES6:

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

    如今,有一种简单的方法: Object.values() .

    var myObj = {
        1: [1, 2, 3],
        2: [4, 5, 6]
    };
    
    console.log(Object.values(myObj));
    

    输出:

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

    这不是在ECMAScript 2017中定义的 .
    每个现代浏览器都支持它(忘记IE) .

  • 2

    jQuery.makeArray(obj) 怎么样

    这就是我在我的应用程序中做到的方式 .

  • 15

    解决方法非常简单

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

    小提琴演示

    扩展回答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()

  • 28

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

    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()=> 函数应用于每个属性并返回一个数组; Object.assign() 合并每个属性的名称和值 .

  • 0

    我做了一个自定义功能:

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

    经过一些测试,这里是数组函数转换器的一般对象:

    You have the object:

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

    The function:

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

    Function Use:

    var arr = ObjectToArray(obj);
    

    You Get:

    arr {
    关键:[
    “some_key_1”
    “some_key_2”
    ]
    Value :[
    “some_value_1”
    “some_value_2”
    ]
    长度:2
    }

    那么你可以达到所有键和值,如:

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

    Result in console:

    some_key_1 = some_value_1
    some_key_2 = some_value_2 Edit:

    或者以原型形式:

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

    And then use like:

    console.log(obj.objectToArray);
    
  • 415

    您可以创建一个简单的函数来执行从 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) ,它将为您返回作为数组的所有属性,但在许多浏览器中尚不支持...

  • 19

    ES8 way 变得容易:

    The official documentation

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

相关问题