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

IT技术 javascript arrays json
2021-02-09 21:07:27

给定一个 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"}]
6个回答
var dataArray = Object.keys(dataObject).map(function(k){return dataObject[k]});
@Qix:你的意思是快得多
2021-03-13 21:07:27
@Qix:而且for (var o = 0, l = dataObject.length; o < l; o++) {}会比for ... in. 虽然,map 中的函数非常复杂并且使用多个线程和 webworkers 处理时,map可能会更快……但是,几乎所有情况下,for 循环都要快得多。
2021-03-13 21:07:27
这是非常安全惯用的Object.keys 在hasOwnProperty内部做了一个
2021-03-24 21:07:27
添加hasOwnProperty对已接受答案的检查比首先构建数组并遍历 O(N) 空间 + O(N) 时间的这种方法更有效。
2021-03-26 21:07:27
@julien 不。完全没有。差远了。在每种情况下,接受的答案总是更快。
2021-03-27 21:07:27
var dataArray = [];
for(var o in dataObject) {
    dataArray.push(dataObject[o]);
}
如果您不想包含对象原型中的属性(如果它是普通对象,不应包含任何属性),您可以通过检查dataObject.hasOwnProperty(o).
2021-03-14 21:07:27
在您看来,什么是“排序”?
2021-03-21 21:07:27
有什么理由在new Array这里使用而不是[]
2021-03-31 21:07:27
@SLaks 因为对象被定义为an unordered collection of properties没有要保留的顺序。
2021-04-06 21:07:27
旁注:如果由于某种原因向其中添加了额外的属性,Object.prototype则不使用hasOwnProperty().
2021-04-11 21:07:27

ES6版本:

var dataArray = Object.keys(dataObject).map(val => dataObject[val]);
感谢@ChristianNilsson 的提醒。我编辑了答案。
2021-04-01 21:07:27

使用下划线

var dataArray = _.values(dataObject);
@Veverke Underscore 是一个使用非常广泛的公共库。
2021-04-02 21:07:27

使用 jQuery,你可以这样做 -

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

演示