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

Mat*_*ris 60 javascript arrays json

给定一个JavaScript对象:

var dataObject = {
   object1: {id: 1, name: "Fred"}, 
   object2: {id: 2, name: "Wilma"}, 
   object3: {id: 3, name: "Pebbles"}
};
Run Code Online (Sandbox Code Playgroud)

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

var dataArray = [
    {id: 1, name: "Fred"}, 
    {id: 2, name: "Wilma"}, 
    {id: 3, name: "Pebbles"}]
Run Code Online (Sandbox Code Playgroud)

小智 71

var dataArray = Object.keys(dataObject).map(function(k){return dataObject[k]});
Run Code Online (Sandbox Code Playgroud)

  • 这是*更安全*和*惯用*.Object.keys在内部执行`hasOwnProperty`. (3认同)
  • @Qix:你的意思是**快**? (2认同)

Mur*_* VP 64

var dataArray = [];
for(var o in dataObject) {
    dataArray.push(dataObject[o]);
}
Run Code Online (Sandbox Code Playgroud)

  • 您认为什么是"订购"? (12认同)
  • 如果你不想在对象的原型中包含属性(如果它是普通对象,那么*不应该是*),你可以通过检查`dataObject.hasOwnProperty(o)`来过滤它们. (11认同)
  • 旁注:如果由于某种原因将额外的属性添加到`Object.prototype`,这将在不使用`hasOwnProperty()`的情况下中断. (7认同)
  • 有没有理由在这里使用`new Array`而不是`[]`? (3认同)

Tho*_*ran 25

ES6版本:

var dataArray = Object.keys(dataObject).map(val => dataObject[val]);
Run Code Online (Sandbox Code Playgroud)


rzy*_*mek 23

使用下划线:

var dataArray = _.values(dataObject);
Run Code Online (Sandbox Code Playgroud)

  • @Veverke Underscore是一个使用非常广泛的公共图书馆. (14认同)

Moh*_*dil 14

使用jQuery,你可以这样做 -

var dataArray = $.map(dataObject,function(v){
     return v;
});
Run Code Online (Sandbox Code Playgroud)

演示


rya*_*uen 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)
Run Code Online (Sandbox Code Playgroud)


Mar*_*mic 6

假设您的dataObject是按照您指定的方式定义的,您可以这样做:

var dataArray = [];
for (var key in dataObject)
    dataArray.push(dataObject[key]);
Run Code Online (Sandbox Code Playgroud)

并最终使用内部对象填充dataArray.

  • 他想要对象本身,而不是他们的名字. (2认同)

Ste*_*uan 6

[编辑和更新我的答案。其他答案似乎与我的几乎重叠,但是,我认为我以前有另一个答案并提供了替代方案]。

我针对这个问题提出了 3 个解决方案,基于:

  • 对象.keys
  • 对象值
  • 对象条目

Objects.keys() 解决方案:

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"}]
Run Code Online (Sandbox Code Playgroud)

Object.values 解决方案:

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

Run Code Online (Sandbox Code Playgroud)

Object.entries 解决方案:

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"}]
Run Code Online (Sandbox Code Playgroud)

这三种解决方案都有自己的特点。

Object.keys() 返回一个结果不足的数组。因此,我们使用 Array.prototype.map 来填充数组中的每个值以接近我们想要的值。通常,我们可以将 Object.keys() 与 map 结合视为一种机制,可以根据我们的需要自定义结果列表。

Object.values() 很有趣,因为它丢弃键并且只返回结果。事实上,对于这个问题,这是完美的,因为答案不需要进一步处理。

Object.entries() 返回的比我们想要的更多,因为它同时返回键和值。我们需要使用 map 来自定义我们的结果。事实上,我们需要剪掉多余的信息。

Object.keys()、Object.values() 和 Object.entries() 都是非常有用的函数,这就是为什么我想展示所有 3 个作为这个问题的解决方案。根据您的特定用例,您可能会找到更适合解决问题的方法。


mar*_*rix 6

使用接受的答案并知道在ECMAScript 2017草案中提出了Object.values(),您可以使用方法扩展Object:

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


mar*_*itz 5

也许有点冗长,但是强大且快速

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