Chuyển đổi một đối tượng JS thành một mảng bằng jQuery


417

Ứng dụng của tôi tạo một đối tượng JavaScript, như sau:

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

Nhưng tôi cần đối tượng này như là một mảng.

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

Vì vậy, tôi đã cố gắng chuyển đổi đối tượng này thành một mảng bằng cách lặp $.eachqua thông qua đối tượng và thêm phần tử vào một mảng:

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

Có cách nào tốt hơn để chuyển đổi một đối tượng thành một mảng hoặc có thể là một hàm không?


1
Các chỉ số mảng có nên giống như các khóa trong đối tượng ban đầu không? Chỉ mục đầu tiên trong một mảng luôn là 0, nhưng mã của riêng bạn và hầu hết các câu trả lời (bao gồm cả câu được chấp nhận) dường như bỏ qua nó; Tuy nhiên, bạn đã hoàn nguyên chỉnh sửa của tôi thành kết quả ví dụ mong muốn.
Imre

1
Đúng, bạn đã đúng: phần tử Array đầu tiên bắt đầu bằng 0. Nhưng tôi đã hoàn nguyên chỉnh sửa của bạn, bởi vì nó không nhất quán trong mắt tôi để giữ cho ví dụ đó đơn giản nhất có thể, bởi vì thay đổi myObj= {1:[Array-Data]thành myObj= {0:[Array-Data]không phải là một phần của chỉnh sửa của bạn (như tôi nhớ đúng)
Bndr

3
Sử dụng lệnh jQuery $ .makeArray (obj) cho api.jquery.com/jQuery.makeArray
DevlshOne

@DevlshOne tài liệu bạn cung cấp có nội dung: "Biến một đối tượng jQuery thành một mảng" tôi không nghĩ điều này phù hợp với câu hỏi của OP
Alex

Câu trả lời:


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

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


console.log(array);

Đầu ra:

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

8
@Dogbert, bạn có thể giải thích $.map? Mỗi tìm kiếm tôi cố gắng thực hiện điều này chỉ xuất hiện rất nhiều liên kết đến jQuery hoặc phương thức bản đồ của mảng.
crantok

21
Ôi! Bỏ qua bình luận của tôi. Tôi đã không nhận thấy thẻ jQuery về câu hỏi này.
crantok

8
Có cách nào để duy trì các khóa trong mảng mới không? mỗi câu trả lời trên www tôi thấy thiếu chuyển đổi khóa.
TD_Nijboer

55
Bạn cũng có thể làm điều này mà không cần jQuery: Object.keys (myObject) .map (function (val) {return [val]});
Kris Erickson

3
@TD_Nijboer Có, sử dụng value.key = index; return [value];thay vìreturn [value];
Simon Arnold

742

Nếu bạn đang tìm kiếm một phương pháp chức năng:

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

Kết quả trong:

[11, 22]

Tương tự với chức năng mũi tên ES6:

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

Với ES7, bạn sẽ có thể sử dụng Object.valuesthay thế ( thêm thông tin ):

var arr = Object.values(obj);

Hoặc nếu bạn đã sử dụng Underscore / Lo-Dash:

var arr = _.values(obj)


3
Không hài lòng với câu trả lời hàng đầu, tôi chỉ viết chức năng gần như chính xác này, quay lại để đăng nó dưới dạng câu trả lời, cuộn xuống, thấy 170. Nhận ra, người đàn ông Nếu tôi không từ bỏ tôi sẽ không phải suy nghĩ :) Điều này nên ở trên đỉnh OP xin chọn làm câu trả lời.
j03m

1
đối với bất kỳ ai mà điều này không rõ ràng, các khóa không cần phải tuần tự (ví dụ trong ví dụ này là 1 và 2 - nhưng chúng cũng có thể là khóa chuỗi hoặc số không tuần tự
Simon_Weaver

Đối với đoạn mã đầu tiên tôi bị thiếu dấu hai chấm. Không chắc chắn lý do tại sao.
JohnnyBizzle

@JohnnyBizzle Tôi đoán người nói dối của bạn yêu cầu viết "return obj [key];" với một dấu chấm phẩy cuối cùng. JavaScript không mặc dù.
Joel Richard

30

Tôi nghĩ rằng bạn có thể sử dụng for innhưng kiểm tra nếu tài sản không được suy ra

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

EDIT - nếu bạn muốn, bạn cũng có thể giữ các chỉ mục của đối tượng của mình, nhưng bạn phải kiểm tra xem chúng có phải là số không (và bạn nhận được các giá trị không xác định cho các chỉ mục bị thiếu:

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

1
Bạn nên kiểm tra mã. $.mapsẽ san phẳng Array-Data.
Marko Dumic

bạn đúng tôi đã không kiểm tra nó với một mảng và bản đồ làm phẳng nó! tôi đã sửa đổi câu trả lời
Nicola Peluchetti

@Nicola Peluchetti $ .makeArray () nghe có vẻ hay, nhưng không phải là thứ tôi đang tìm kiếm, bởi vì nó chỉ đơn giản là đưa đối tượng vào một thành phần mảng: [{1:[Array-Data], 2:[Array-Data]}]$.map()cũng không thành công. Nó nối, rằng tất cả dữ liệu Sub-Array được hợp nhất thành một mảng. array.lengthsẽ trả về 2 (vì tồn tại 2 phần tử), nhưng nó trả về 67 là số lượng của tất cả các phần tử trong tất cả ["Mảng dữ liệu"].
Bndr

@The Bndr tôi đã đăng một giải pháp khác, nhưng bạn có thể sử dụng bản đồ theo đề xuất của
dogbert

Tôi nghĩ rằng bạn phải chỉ định rõ ràng chỉ số mảng ... như arr[+i] = myObj[i];bởi vì (i) for(...in...)không được đảm bảo trả lại các thuộc tính theo bất kỳ thứ tự nào (ii) trong ví dụ của OP, các thuộc tính bắt đầu từ 1, không phải 0.
Salman A

30

Đơn giản chỉ cần làm

Object.values(obj);

Đó là tất cả!


11
Object.values ​​là một phương thức ES2017 không được hỗ trợ trong Safari, IE, Node 6.
Phil Ricketts

25

Nếu bạn biết chỉ số tối đa trong đối tượng của mình, bạn có thể làm như sau:

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


1
Sẽ tốt hơn nhiều cho mã đang tạo đối tượng cũng đặt độ dài hoặc thực sự biến nó thành một mảng ở vị trí đầu tiên. Tôi không mong đợi một trong hai điều đó là có thể, vì vậy câu trả lời này đối với tôi không hữu ích.
user2000095-tim

myObj.length = Object.keys(myObj).length
hói

19

Vì ES5 Object.keys () trả về một mảng chứa các thuộc tính được xác định trực tiếp trên một đối tượng (không bao gồm các thuộc tính được xác định trong chuỗi nguyên mẫu):

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

ES6 tiến thêm một bước với các chức năng mũi tên:

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

1
Đối với ES5 hiện tại (mặc dù tôi rất thích ES6): Object.keys (yourObject) .map (function (key) {return yourObject [key]});
David Zorychta

18

Ngày nay, có một cách đơn giản để làm điều này: Object.values ​​() .

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

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

Đầu ra:

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

Điều này không cần jQuery, nó được định nghĩa trong ECMAScript 2017.
Nó được hỗ trợ bởi mọi trình duyệt hiện đại (quên IE).


nếu tôi làm điều gì đó giống như var state = { ingredient: { salad: 1, bacon: 1, } }và sau đó var HariOm = Object.values(state);tiếp theo console.log(typeof HariOM)nó sẽ hiển thị kiểu như là một đối tượng. Nó không nên hiển thị nó như là một mảng?
iRohitBhatia

Điều đó hoàn toàn bình thường, hãy kiểm tra tài liệu tham khảo tại đây: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Array.isArray(HariOM)
mẹo

16

Phương pháp tốt nhất sẽ là sử dụng hàm javascript -only:

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

@Qwerty trình duyệt nào?
test30

Trình duyệt Chrome. Đã thử nghiệm vớivar myObj = {1:[1,2,3],2:[4,5,6]};
Qwerty

Lưu ý rằng phương pháp này hoạt động để chuyển đổi "các đối tượng giống như mảng", nghĩa là chúng phải có thuộc tính "độ dài" và các thuộc tính được liệt kê từ 0. Vì vậy, để làm cho ví dụ của @ Qwerty hãy thử: {0: [1 , 2,3], 1: [4,5,6], chiều dài: 2}. Thử nghiệm với các giá trị chỉ mục và giá trị độ dài, đó là một chút khoan dung. Đây là một bài đọc tốt về chủ đề: nfriedly.com/techblog/2009/06/ trên Bỏ qua "Các đối tượng giống như mảng".
Matt

15
x = [];
for( var i in myObj ) {
    x[i] = myObj[i];
}

10
Bạn nên sử dụng lực đẩy, nếu không bạn có thể sẽ tạo ra một vật thể
Nicola Peluchetti

Có lẽ đó là một số lực tốt hơn để int chỉ số. var bbb = {'1': 'a', '3': 'b'}; var x = []; for (var i in bbb) { x[parseInt(i)] = bbb[i];} console.log(x);
tres.14159

15

ECMASCRIPT 5:

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

ECMASCRIPT 2015 hoặc ES6:

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

13

Làm thế nào về jQuery.makeArray(obj)

Đây là cách tôi đã làm nó trong ứng dụng của tôi.


2
Điều này trả về [Object] cho ví dụ trên.
Kris Erickson

1
chỉ là vấn đề thêm chỉ số [0] và bạn đã cứu mạng tôi :)
Raheel

6

Cách giải rất đơn giản.

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


3

Fiddle Demo

Mở rộng để trả lời của 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);


Tài liệu tham khảo

Array.prototype.slice ()

Hàm.prototype.apply ()

Object.prototype.hasOwnProperty ()

Object.keys ()


Tôi có thể sai, nhưng nó có tốt hơn để myObj trở thành vô số bắt đầu từ 0 không? Khác, có vẻ như với tôi rằng chúng ta có một vấn đề trong đó Mảng của chúng ta sẽ là: [không xác định, [1, [2], 3]] (Phần đầu tiên không được xác định vì nó không tìm thấy myObj ['0'] và phần cuối myObj ['2'] bị loại bỏ vì sau khi đọc .length nó dừng lại ở myObj ['1']?
Alex Werner

2

Nếu bạn muốn giữ tên thuộc tính của đối tượng làm giá trị. Thí dụ:

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

Sử dụng Object.keys(), Array.map()Object.assign():

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

Kết quả:

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

Giải trình:

Object.keys()liệt kê tất cả các thuộc tính của nguồn; .map()áp dụng =>hàm cho mỗi thuộc tính và trả về một mảng; Object.assign()hợp nhất tên và giá trị cho mỗi tài sản.


1

Tôi đã thực hiện một chức năng tùy chỉnh:

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

0

Sau một số thử nghiệm, đây là một đối tượng chung để chuyển đổi hàm mảng:

Bạn có đối tượng:

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

Chức năng:

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

Chức năng sử dụng:

var arr = ObjectToArray(obj);

Bạn lấy:

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

Vì vậy, sau đó bạn có thể đạt được tất cả các khóa & giá trị như:

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

Kết quả trong bảng điều khiển:

some_key_1 = some_value_1
some_key_2 = some_value_2

Biên tập:

Hoặc ở dạng nguyên mẫu:

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

Và sau đó sử dụng như:

console.log(obj.objectToArray);

0

Bạn có thể tạo một chức năng đơn giản để thực hiện chuyển đổi từ objectsang array, một cái gì đó như thế này có thể thực hiện công việc cho bạn bằng cách sử dụng javascript thuần túy:

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

hoặc cái này:

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

và gọi và sử dụng chức năng như dưới đây:

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

Ngoài ra, trong tương lai, chúng tôi sẽ có một cái gì đó được gọi là Object.values(obj)tương tự Object.keys(obj)sẽ trả về tất cả các thuộc tính cho bạn dưới dạng một mảng, nhưng chưa được hỗ trợ trong nhiều trình duyệt ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.