将具有数字键的JavaScript对象转换为数组

183

我从服务器获得的JSON响应中返回了这样一个对象:

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

我想把它转换成这样的 JavaScript 数组:

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

有没有最佳方法来完成这个任务?我看到很多人都在使用循环的复杂逻辑。那么除了循环之外,还有其他的方法吗?


3
请将JS对象转换为数组的更好方法 - BENARD Patrick
8
顺便说一下,仅仅一个循环并不构成“复杂逻辑”:)) - moonwave99
17个回答

331

使用jQuery的$.map实际上非常简单。

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

FIDDLE

而且,即使没有使用jQuery,也可以使用相同的方法。只需将键转换为数组,然后使用Array.map映射回值即可。

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

FIDDLE

假设它已经解析为javascript对象,而不是JSON字符串格式,那么需要通过JSON.parse来进行转换。

在ES2015中,有Object.values来拯救你,这简直太方便了。

var arr = Object.values(obj);

1
@adeneo 先生,您能否请提供一些关于这些方法的解释。 - Nikhil Agrawal
1
@adeneo,也就是Mr. Burns...感谢您提供的快速解决方案。 - Dzeimsas Zvirblis
1
@NikhilAgrawal 这里的技巧是使用Object.keys(),它返回对象的键(即其自身可枚举属性)作为数组。然后我们可以使用array.map在新数组中将每个键替换为相应的值。 - antoine
1
这是一个答案,但不是很友善的答案。 - sheriffderek
3
这个问题并不是很明确,但我认为对象的键是数组的索引,因为它们是(0,1,2,3)。需要指出的是,人们应该知道这种方法不能保证数组中的任何顺序; 如果键是索引,则需要显式地对它们进行排序,以便按正确顺序构建数组。 - leejt489
显示剩余6条评论

108

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

console.log(arr)

希望这正是你需要的内容!


谢谢。真的需要那个。有人在大量代码中将对象用作数组,这很好,直到我需要在其上构建... - amanda fouts
非常接近我需要的,谢谢: for(var x in data){ arr[x] = data[x]; } - Andrew

24

您只需像这样操作:

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

var arr = [];
for (var prop in data) {
    arr.push(data[prop]);
}

console.log(arr);

演示


20

没有称为“JSON对象”的东西 - JSON是一种序列化符号。

如果您想将您的javascript对象转换为javascript数组,则可以编写自己的循环[这并不那么复杂!]或依赖于underscore.js _.toArray() 方法:

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

1
谢谢 - 运行得很好。但是如何使它也对内部对象(即对象中的对象)执行相同的操作?内部对象也应成为根级别数组的扁平成员(以便可以传递给datatables.net等)。 - Gopalakrishna Palem
+1: "没有什么东西叫做“JSON对象” - JSON只是一种序列化标记。" - 我简直无法相信在完全理解之前,我竟然听了这么多遍。 - radbyx

9

这里没有什么难的。循环遍历您的对象元素并将它们分配给数组。

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

http://jsfiddle.net/Qq2aM/


9

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

var array = [];
for (var i in JsonObj) {
  if (JsonObj.hasOwnProperty(i) && !isNaN(+i)) {
    array[+i] = JsonObj[i];
  }
}

console.log(array)

演示


5
您可以使用空数组字面量[]作为target来使用Object.assign()

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

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

console.log(output)

如果您查看填充(polyfill)Object.assign(target, ...sources) 只是将所有可枚举的自有属性从 source 对象复制到目标对象。如果 target 是一个数组,则会将数字键添加到数组文字中,并返回该 target 数组对象。


4

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

var vals = Object.values(obj);

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

另一个解决这个问题的方法是:
var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed

4

试试这个:

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

你的解决方案将是所有呈现的方案中最慢的...对于商业代码来说很糟糕 ;) - HellBaby

2

我不确定我在这里缺少什么,但是只需尝试以下代码即可完成。 我有什么遗漏吗?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接