如何将JavaScript对象的属性值提取到数组中?


71

给定一个JavaScript对象:

var dataObject = {
   object1: {id: 1, name: "Fred"}, 
   object2: {id: 2, name: "Wilma"}, 
   object3: {id: 3, name: "Pebbles"}
};

如何有效地将内部对象提取到数组中? 我不需要维护object [n] ID的句柄。

var dataArray = [
    {id: 1, name: "Fred"}, 
    {id: 2, name: "Wilma"}, 
    {id: 3, name: "Pebbles"}]

Answers:


69
var dataArray = [];
for(var o in dataObject) {
    dataArray.push(dataObject[o]);
}

13
您认为什么是“订购”?
Marko Dumic 09年

11
如果您不想包含对象原型的属性(如果是普通对象则不应该包含任何属性),则可以通过选中过滤它们dataObject.hasOwnProperty(o)
马修·克鲁姆利

7
注意:如果由于某些原因添加了额外的属性,Object.prototype则不使用就会中断hasOwnProperty()
2013年

3
有什么理由在new Array这里代替[]
邓肯·卢克

1
@SLaks,因为将对象定义为an unordered collection of properties没有保留顺序。
符文FS

74
var dataArray = Object.keys(dataObject).map(function(k){return dataObject[k]});

2
@Qix:您的意思是这么吗?
julien 2014年

1
@julien不,一点也不。差远了。在每种情况下,可接受的答案总是更快。
Qix-蒙尼卡(Monica)2014年

1
@Qix:而且for (var o = 0, l = dataObject.length; o < l; o++) {}甚至比还要快for ... in。虽然,当映射中的函数非常复杂并且使用多个线程和Webworkers处理时,映射可能会更快。但是,是的,在几乎所有情况下,for循环都快得多。
okdewit

3
这样更加安全习惯。Object.keys在hasOwnProperty内部执行。
Rico Kahler

1
hasOwnProperty此方法中,首先构建一个数组,并遍历O(N)空间+ O(N)时间,比在此方法中添加检查所接受的答案的效率更高。
Murali副总裁,

31

ES6版本:

var dataArray = Object.keys(dataObject).map(val => dataObject[val]);

感谢@ChristianNilsson的提醒。我编辑了答案。
索兰



9

ES2017使用Object.values

const dataObject = {
    object1: {
        id: 1,
        name: "Fred"
    },
    object2: {
        id: 2,
        name: "Wilma"
    },
    object3: {
        id: 3,
        name: "Pebbles"
    }
};

const valuesOnly = Object.values(dataObject);

console.log(valuesOnly)


6

假设以您指定的方式定义了dataObject,请执行以下操作:

var dataArray = [];
for (var key in dataObject)
    dataArray.push(dataObject[key]);

最终用内部对象填充了dataArray。


1
这也不符合他的要求。
SLaks

2
他想要物体本身,而不是它们的名称。
SLaks

在这种情况下,只需在第三行中省略“ .name”即可。
Marko Dumic 09年


4

[事实证明,我的答案与@Anonymous相似,但我将其保留在此处,因为它解释了如何获得答案]。

原始对象具有三个属性(即3个键和3个值)。这建议我们应该将Object.keys()其转换为具有3个值的数组。

var dataArray = Object.keys(dataObject);
// Gives: ["object1", "object2", "object3" ]

现在,我们有3个值,但没有3个值。因此,这建议我们应该使用Array.prototype.map()

var dataArray = Object.keys(dataObject).map(function(e) { return dataObject[e]; } );
// Gives: [{"id":1,"name":"Fred"},{"id":2,"name":"Wilma"},{"id":3,"name":"Pebbles"}]

3

可能有点冗长,但功能强大且快速

var result = [];
var keys = Object.keys(myObject);
for (var i = 0, len = keys.length; i < len; i++) {
    result.push(myObject[keys[i]]);
}



0

这个为我工作

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

0

我更喜欢将对象值分解为数组:

[...Object.values(dataObject)]

var dataObject = {
   object1: {id: 1, name: "Fred"}, 
   object2: {id: 2, name: "Wilma"}, 
   object3: {id: 3, name: "Pebbles"}
};

var dataArray = [...Object.values(dataObject)];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.