如何将包含对象的对象转换为对象数组

106

这是我的对象

var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

这是我期望的输出

data = [ 
    {"0": "1"},
    {"1": "2"},
    {"2": "3"},
    {"3": "4"}
]

然后看看我的有关目标结构的评论。这是一种糟糕的输出格式,而且在JavaScript中使用起来很麻烦。为什么不把所有的键/值对都放在一个单独的对象中呢? - jfriend00
1
我在我的应用程序中使用了一个第三方库,它需要按照我想要的格式输入。没办法。 - Nick Div
2
哇,这些评论让我头疼。一个对象数组在JavaScript中怎么会“难用”呢?虽然这些对象通常都有相同的结构,但我们经常使用对象数组,而且非常容易使用。 - iGanja
12个回答

139

这对我很有效

var newArrayDataOfOjbect = Object.values(data)

另外,如果你有键值对象,请尝试:

const objOfObjs = {
   "one": {"id": 3},
   "two": {"id": 4},
};

const arrayOfObj = Object.entries(objOfObjs).map((e) => ( { [e[0]]: e[1] } ));

会返回:

[
  {
    "one": {
      "id": 3
    }
  },
  {
    "two": {
      "id": 4
    }
  }
]

4
请注意,这不支持IE、Safari和Opera浏览器。 - Anirudha
Object.values() 在 FireFox 中不受支持。 - Omar
这个不返回OP规定的数据。@Shuwei的答案完美运行。 - evolross
typeof仍然返回“object” - bareMetal

56
var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

var myData = Object.keys(data).map(key => {
    return data[key];
})

这对我有用


这似乎是所有浏览器支持的最佳解决方案。 - iGanja
当然,IE仍然存在映射问题。 请尝试使用以下代码: var myData = Object.keys(data).map(function(x) { return data[x]; }); - iGanja
如何撤销它? - Kibotu
17
将数据对象的所有键值提取为数组并返回,代码示例:let myData = Object.keys(data).map(key => data[key]); - Jason Rice
这是最准确的解决方案,感谢@JasonRice和Shuwei。 - Lalana Chamika

11

被接受的答案没有考虑到原始问题想要摆脱键。它仅返回对象,而不是它们的父键。

Object.entries(ObjOfObjs).map(e => e[1]) 输出:

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

7

您可以使用Object.values()函数轻松实现此操作。

var data = {
    a:{"0": "1"},
    b:{"1": "2"},
    c:{"2": "3"},
    d:{"3": "4"}
};

console.log(Object.values(data))


2
这是将内容转换的简单方法。 - MA Deldari

5

您需要为对象中的每个值命名。

一旦您修复了第一个对象,那么您就可以使用push来完成它。

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

var ar = [];
for(item in data){
    ar.push(data[item]);
 }

console.log(ar);

http://jsfiddle.net/nhmaggiej/uobrfke6/


我在想是否有其他方法而不是循环整个对象。因为我有大约一千条记录。但如果没有其他可行的方法,那么我可以使用这种方法。谢谢。 - Nick Div

2

这是一个简单的方法,以不可变的方式完成,因此您的主要数据不会受到影响,但您可以根据需要创建新的mappedData并创建新的数组。

let data = {
  a: { "0": "1" },
  b: { "1": "2" },
  c: { "2": "3" },
  d: { "3": "4" }
};

const mappedDataArray = [];

for (const key in data) {
  const mappedData = {
    ...data[key]
  };
  mappedDataArray.push(mappedData);
}

console.log(mappedDataArray);
console.log(data);

1

简单的黑客

  var data = {
        a:{"0": "1"},
        b:{"1": "2"},
        c:{"2": "3"},
        d:{"3": "4"}
    };

 data = Object.values(data).map((item)=>item)
console.log(data)

1
最后,当你从对象获取值时,将对象转换为对象数组对我有用。
       const snapshortObject = snapshot.val(); //  And they look like this are stored value.

  let snapshortObject = {
      a: { 
            message: "Hiiii",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:18 2022"
      },
      b: { 
            message: "Hiiii",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:18 2022"
      },
      c: { 
            message: "Hello ",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:50 2022"
      },
      d: { 
            message: "Hello ",
            senderId: "tQusPaBhoJXcu2ezlsDxQMUTLCq1",
            timestamp: "Wed Jun  8 18:16:50 2022"
      }
    };
    
    const mappedDataArray = [];
    slno=1
    for (const key in snapshortObject) {
      const mappedData = {
        ...snapshortObject[key],
        slno:slno++
      };
      mappedDataArray.push(mappedData);
    }
    console.log(mappedDataArray);

1


1
var array = [];
for(var item in data){
    // this condition is required to prevent moving forward to prototype chain
    if(data.hasOwnProperty(item)){
        array.push(data[item]);
    } 
}

@jfriend00 请查看这个问题 - frogatto

0

我明白你想要什么!这是你的解决方案,

var dataObject=[{name:'SrNo',type:'number'}];

要访问或存储数组,请使用

dataObject[0].srno=1;
dataObject[0].srno=2;

希望这是你所需要的。

这是正确的,因为我在我的代码中使用了它。你试试,然后你就会明白! - Ashitosh birajdar
这并未提供 OP 问题的任何答案,此代码仅向 dataObject[0] 对象添加一个新属性。 - frogatto

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