使用jQuery将JS对象转换为数组
我的应用程序创build一个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);});
有没有更好的方法将对象转换为数组或可能是一个函数?
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]]
如果您正在寻找function性方法:
var obj = {1: 11, 2: 22}; var arr = Object.keys(obj).map(function (key) { return obj[key]; });
结果是:
[11, 22]
与ES6箭头function一样:
Object.keys(obj).map(key => obj[key])
使用ES7,您将可以使用Object.values
( 更多信息 ):
var arr = Object.values(obj);
或者如果您已经在使用Underscore / Lo-Dash:
var arr = _.values(obj)
我认为你可以使用for in
但检查财产是否没有inerithed
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]); } } }
如果您知道对象中的最大索引,则可以执行以下操作:
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']]
由于ES5 Object.keys()返回一个包含直接在对象上定义的属性的数组(不包括在原型链中定义的属性):
Object.keys(yourObject).map(function(key){ return yourObject[key] });
ES6使用箭头function更进一步:
Object.keys(yourObject).map(key => yourObject[key]);
简单地做
Object.values(obj);
就这样!
x = []; for( var i in myObj ) { x[i] = myObj[i]; }
最好的方法是使用javascript -only函数:
var myArr = Array.prototype.slice.call(myObj, 0);
ECMASCRIPT 5:
Object.keys(myObj).map(function(x) { return myObj[x]; })
ECMASCRIPT 2015或ES6:
Object.keys(myObj).map(x => myObj[x])
如何jQuery.makeArray(obj)
这是我在我的应用程序中做到的。
小提琴演示
扩展到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()
解决方法非常简单
var my_obj = {1:[Array-Data], 2:[Array-Data]} Object.keys(my_obj).map(function(property_name){ return my_obj[property_name]; });
我做了一个自定义函数:
Object.prototype.toArray=function(){ var arr=new Array(); for( var i in this ) { if (this.hasOwnProperty(i)){ arr.push(this[i]); } } return arr; };
如果你想保留对象属性的名字作为值。 例:
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()
将=>
函数应用于每个属性并返回一个Array; Object.assign()
合并每个属性的名称和值。
经过一些testing,这里是数组函数转换器的一般对象:
你有这个对象:
var obj = { some_key_1: "some_value_1" some_key_2: "some_value_2" };
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++) { rk[i] = k[i]; rv[i] = v[i]; } return r; }
function用途:
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
编辑:
或者以原型forms:
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++) { rk[i] = k[i]; rv[i] = v[i]; } return r; };
然后使用像:
console.log(obj.objectToArray);
你也可以使用这个数组/开源组件来使数组变形。
例子:
makeArray(1) // => [1] makeArray([1]) // => [1] makeArray(null) // => []
还有一个NPM的微型封装 。
你可以创build一个简单的函数来完成从object
到array
的转换,像这样的东西可以为你使用纯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; };
并调用和使用该function如下:
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)
,它将以数组的forms返回所有的属性,但在许多浏览器中不支持…