Преобразование объекта JS в массив с использованием jQuery - PullRequest
407 голосов
/ 28 июля 2011

Мое приложение создает объект 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 ]

733 голосов
/ 02 октября 2014

Если вы ищете функциональный подход:

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 вместо ( больше информации ):

var arr = Object.values(obj);

Или, если вы уже используете Underscore / Lo-Dash:

var arr = _.values(obj)
420 голосов
/ 28 июля 2011
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]]
30 голосов
/ 28 июля 2011

Я думаю, что вы можете использовать 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]);
        }
    }
}
28 голосов
/ 15 мая 2017

Просто сделай

Object.values(obj);

Вот и все!

24 голосов
/ 28 июля 2011

Если вам известен максимальный индекс в вашем объекте, вы можете сделать следующее:

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']]
19 голосов
/ 02 декабря 2014

Поскольку ES5 Object.keys () возвращает массив, содержащий свойства, определенные непосредственно для объекта (исключая свойства, определенные в цепочке прототипов):

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

ES6 делает еще один шаг вперед благодаря функциям стрелок:

Object.keys(yourObject).map(key => yourObject[key]);
15 голосов
/ 12 мая 2016

ECMASCRIPT 5:

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

ECMASCRIPT 2015 или ES6:

Object.keys(myObj).map(x => myObj[x])
15 голосов
/ 06 февраля 2018

В настоящее время существует простой способ сделать это: 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).

15 голосов
/ 28 июля 2011
x = [];
for( var i in myObj ) {
    x[i] = myObj[i];
}
15 голосов
/ 26 мая 2014

Лучшим методом будет использование только javascript-функции:

var myArr = Array.prototype.slice.call(myObj, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...