Chuyển đổi đối tượng JavaScript với các khóa số thành mảng


175

Tôi có một đối tượng như thế này trở lại dưới dạng phản hồi JSON từ máy chủ:

{"0":"1","1":"2","2":"3","3":"4"}

Tôi muốn chuyển đổi nó thành một mảng JavaScript như thế này:

["1","2","3","4"]

Có cách nào tốt nhất để làm điều này? Bất cứ nơi nào tôi đang đọc, mọi người đang sử dụng logic phức tạp bằng cách sử dụng các vòng lặp. Vì vậy, có phương pháp thay thế để làm điều này?



8
Nhân tiện, một vòng lặp không phải là logic phức tạp :))
moonwave99 20/07/2015

Câu trả lời:


328

Nó thực sự rất thẳng về phía trước với jQuery $.map

var arr = $.map(obj, function(el) { return el });

VĨ CẦM

và hầu như dễ dàng mà không cần jQuery, chuyển đổi các khóa thành một mảng và sau đó ánh xạ lại các giá trị với Array.map

var arr = Object.keys(obj).map(function(k) { return obj[k] });

VĨ CẦM

Điều đó giả định rằng nó đã được phân tích cú pháp dưới dạng đối tượng javascript và thực tế không phải là JSON, là định dạng chuỗi, trong trường hợp đó JSON.parsecũng cần phải chạy qua .

Trong ES2015 có Object.valuesgiải cứu, điều này làm cho nó dễ dàng

var arr = Object.values(obj);

1
@adeneo Thưa ông, xin vui lòng cung cấp một số giải thích về các phương pháp htis.
Nikhil Agrawal

1
@adeneo aka Ông bị bỏng ... Cảm ơn vì giải pháp nhanh chóng này.
Dzeimsas Zvirblis

1
@NikhilAgrawal Thủ thuật ở đây là sử dụng Object.keys (), trả về các khóa của đối tượng (= thuộc tính liệt kê riêng của nó) dưới dạng một mảng . Sau đó, chúng ta có thể sử dụng Array.map để thay thế mỗi khóa bằng giá trị tương ứng trong một mảng mới.
antoine

1
Đây là một câu trả lời, nhưng không thân thiện lắm.
cảnh sát trưởng

1
Câu hỏi không rõ ràng, nhưng tôi đã giả sử rằng các khóa của đối tượng là các chỉ mục của mảng theo bản chất của chúng là (0,1,2,3). Chỉ cần chỉ ra rằng mọi người nên biết rằng phương pháp này không đảm bảo bất kỳ thứ tự nào trong mảng; Nếu các khóa là chỉ mục thì bạn cần phải sắp xếp chúng một cách rõ ràng để mảng được xây dựng theo đúng thứ tự.
leejt361

107
var json = '{"0":"1","1":"2","2":"3","3":"4"}';

var parsed = JSON.parse(json);

var arr = [];

for(var x in parsed){
  arr.push(parsed[x]);
}

Hy vọng đây là những gì bạn đang theo đuổi!


cảm ơn. thực sự cần điều đó ai đó đã sử dụng một đối tượng như một mảng trong suốt một tấn mã, điều đó vẫn ổn cho đến khi tôi cần xây dựng trên nó ...
amanda fouts

Cảm ơn bạn! Câu trả lời hoàn hảo.
Vincent

rất gần với những gì tôi cần cảm ơn: for (var x in data) {Array [x] = data [x]; }
Andrew

24

Bạn chỉ đơn giản là làm như thế

var data = {
    "0": "1",
    "1": "2",
    "2": "3",
    "3": "4"
};
var arr = [];
for (var prop in data) {
    arr.push(data[prop]);
}
console.log(arr);

BẢN GIỚI THIỆU


20

Không có gì giống như "đối tượng JSON" - JSON là một ký hiệu tuần tự hóa.

Nếu bạn muốn chuyển đổi đối tượng javascript của mình thành một mảng javascript , bạn có thể viết vòng lặp của riêng mình [sẽ không phức tạp lắm!] Hoặc bạn dựa vào phương thức underscore.js _.toArray() :

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var yourArray = _(obj).toArray();

1
Cảm ơn - làm việc như quyến rũ. Nhưng làm thế nào để làm cho nó làm tương tự cho các đối tượng bên trong (các đối tượng trong các đối tượng)? Các đối tượng bên trong cũng sẽ trở thành thành viên phẳng của mảng ở cấp gốc (để chúng có thể được chuyển đến, ví dụ, datatables.net, v.v.)
Gopalakrishna Palem

+1: "Không có gì giống như" đối tượng JSON "- JSON là ký hiệu tuần tự hóa." - Tôi không thể tin được bao nhiêu lần tôi phải nghe điều này trước khi hiểu nó hoàn toàn.
radbyx

9

Không có gì khó ở đây. Lặp lại các thành phần đối tượng của bạn và gán chúng cho mảng

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var arr = [];
for (elem in obj) {
   arr.push(obj[elem]);
}

http://jsfiddle.net/Qq2aM/



4

Thử cái này:

var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj) {
    newArr.push([obj.value]);
});

Giải pháp của bạn sẽ là giải pháp chậm nhất trong số tất cả được trình bày ở đây ... Xấu cho mã doanh nghiệp;)
HellBaby

3
var obj = {"0":"1","1":"2","2":"3","3":"4"};

var vals = Object.values(obj);

console.log(vals); //["1", "2", "3", "4"]

Một cách khác cho câu hỏi

var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed

2

Sử dụng javascript thô, giả sử bạn có:

var j = {0: "1", 1: "2", 2: "3", 3: "4"};

Bạn có thể nhận được các giá trị với:

Object.keys(j).map(function(_) { return j[_]; })

Đầu ra:

["1", "2", "3", "4"]

2

Không chắc chắn những gì tôi đang thiếu ở đây nhưng chỉ cần thử đoạn mã dưới đây sẽ làm việc. Tôi có thiếu thứ gì ở đây không?

https://jsfiddle.net/vatsalpande/w3ew5bhq/

$(document).ready(function(){

var json = {
   "code" :"1", 
   "data" : { 
    "0" : {"id":"1","score":"44"},
    "1" : {"id":"1","score":"44"}
    }
  };

  createUpdatedJson();

  function createUpdatedJson(){

    var updatedJson = json;

    updatedJson.data = [updatedJson.data];

    $('#jsondata').html(JSON.stringify(updatedJson));


    console.log(JSON.stringify(updatedJson));
  }
 })

1

Giả sử bạn có một giá trị như sau

var obj = {"0":"1","1":"2","2":"3","3":"4"};

Sau đó, bạn có thể biến điều này thành một mảng javascript bằng cách sử dụng như sau

var arr = [];
json = JSON.stringify(eval('(' + obj + ')')); //convert to json string
arr = $.parseJSON(json); //convert to javascript array

Điều này cũng hoạt động để chuyển đổi json thành mảng javascript đa chiều.

Không có phương thức nào khác trên trang này dường như hoạt động hoàn toàn đối với tôi khi làm việc với các chuỗi được mã hóa php json ngoại trừ phương thức tôi đang đề cập ở đây.


1

Dưới đây là một ví dụ về cách bạn có thể nhận được một mảng các đối tượng sau đó sắp xếp mảng.

  function osort(obj)
  {  // map the object to an array [key, obj[key]]
    return Object.keys(obj).map(function(key) { return [key, obj[key]] }).sort(
      function (keya, keyb)
      { // sort(from largest to smallest)
          return keyb[1] - keya[1];
      }
    );
  }

0

Đây là giải pháp tốt nhất. Tôi nghĩ vậy.

Object.keys(obj).map(function(k){return {key: k, value: obj[k]}})

0
      var data = [];

      data  = {{ jdata|safe }}; //parse through js
      var i = 0 ;
      for (i=0;i<data.length;i++){
         data[i] = data[i].value;
      }

2
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
Mogsdad

0

Bạn có thể chuyển đổi json Object thành Array & String bằng PHP.

$data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';

$b=json_decode($data);

$i=0;
while($b->{'resultList'}[$i])
{
    print_r($b->{'resultList'}[$i]->{'displayName'});
    echo "<br />";
    $i++;
}

Câu hỏi là về javascript chứ không phải PHP.
Charles Taylor

-1

Bạn có thể sử dụng Object.assign()với nghĩa đen mảng trống rỗng []như target:

const input = {
  "0": "1",
  "1": "2",
  "2": "3",
  "3": "4"
}

const output = Object.assign([], input)

console.log(output)

Nếu bạn kiểm tra polyfill , Object.assign(target, ...sources)chỉ cần sao chép tất cả các thuộc tính riêng có thể đếm được từ các sourceđối tượng sang một đối tượng đích. Nếu targetlà một mảng, nó sẽ thêm các khóa số vào mảng bằng chữ và trả về targetđối tượng mảng đó.

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.