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

给定一个 JavaScript 对象:

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

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

var dataArray = [
{id: 1, name: "Fred"},
{id: 2, name: "Wilma"},
{id: 3, name: "Pebbles"}]
131030 次浏览
var dataArray = [];
for(var o in dataObject) {
dataArray.push(dataObject[o]);
}

Assuming your dataObject is defined the way you specified, you do this:

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

And end up having dataArray populated with inner objects.

With jQuery, you can do it like this -

var dataArray = $.map(dataObject,function(v){
return v;
});

Demo

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

Using underscore:

var dataArray = _.values(dataObject);

Maybe a bit verbose, but robust and fast

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

ES6 version:

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

In case you use d3. you can do d3.values(dataObject) which will give

enter image description here

[Editing and updating my answer. The other answers seem to overlap with mine pretty much, but, I thought I have another ago and provide an alternative].

I present 3 solutions to this problem, based on:

  • Object.keys
  • Object.values
  • Object.entries

Objects.keys() solution:

let keys = Object.keys(dataObject); // ["object1", "object2", "object3" ];
let keysToResult = keys.map( e => dataObject[e] ); // [{"id":1,"name":"Fred"},{"id":2,"name":"Wilma"},{"id":3,"name":"Pebbles"}]

Object.values solution:

let values = Object.values(dataObject); // [{"id":1,"name":"Fred"},{"id":2,"name":"Wilma"},{"id":3,"name":"Pebbles"}]


Object.entries solution:

let entries = Object.entries(dataObject); // [["object1",{"id":1,"name":"Fred"}],["object2",{"id":2,"name":Wilma"}],["object3",{"id":3,"name":"Pebbles"}]]
let entriesToResult = entries.map( ([k,v]) => v ); [{"id":1,"name":"Fred"},{"id":2,"name":"Wilma"},{"id":3,"name":"Pebbles"}]

All three solutions have their own features.

Object.keys() returns an array with insufficient result. So, we use Array.prototype.map to top up each value in the array to get close to what we want. In general, we can think of Object.keys() combined with map as a mechanism to customize our result list with what we want.

Object.values() is interesting since it discards the key and just returns the results only. In fact, for this problem, this is perfect since the answer requires no further processing.

Object.entries() returns more than what we want since it returns both keys and values. We need to use map to customize our result. In fact, we need to cut out the excess information.

Object.keys(), Object.values() and Object.entries() are all very useful functions which is why I wanted to show all 3 as a solution to this problem. Depending on your specific use case, you may find one to a better fit to solving your problem.

Using the accepted answer and knowing that Object.values() is proposed in ECMAScript 2017 Draft you can extend Object with method:

if(Object.values == null) {
Object.values = function(obj) {
var arr, o;
arr = new Array();
for(o in obj) { arr.push(obj[o]); }
return arr;
}
}

ES2017 using 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)

Object.values() method is now supported. This will give you an array of values of an object.

Object.values(dataObject)

Refer: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values

This one worked for me

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

I prefer to destruct object values into array:

[...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)];