如何在JavaScript中将对象列表转换为对象数组?

时间:2018-11-25 09:50:06

标签: javascript arrays object

我正在学习用Javascript操作数组和对象。

这是对象列表:

输入:

{ user_id: 1,
  name: 'Alice',
  created_at: 2018-11-23T20:47:39.618Z,
  count: '3' }
{ user_id: 4,
  name: 'Daphne',
  created_at: 2018-11-19T21:47:39.618Z,
  count: '3' }
{ user_id: 2,
  name: 'Bob',
  created_at: 2018-11-23T18:47:39.618Z,
  count: '2' }
{ user_id: 5,
  name: 'Evan',
  created_at: 2018-11-18T19:47:39.618Z,
  count: '2' }
{ user_id: 6,
  name: 'Fabia',
  created_at: 2018-11-22T23:47:39.618Z,
  count: '2' }

所需的输出:

[ { user_id: 1,
    name: 'Alice',
    created_at: 2018-11-23T20:47:39.618Z,
    count: '3' },
  { user_id: 4,
    name: 'Daphne',
    created_at: 2018-11-19T21:47:39.618Z,
    count: '3' },
  { user_id: 2,
    name: 'Bob',
    created_at: 2018-11-23T18:47:39.618Z,
    count: '2' },
  { user_id: 5,
    name: 'Evan',
    created_at: 2018-11-18T19:47:39.618Z,
    count: '2' },
  { user_id: 6,
    name: 'Fabia',
    created_at: 2018-11-22T23:47:39.618Z,
    count: '2' } ]

我是javascript编程的新手。一直试图解决这个问题,但还没有解决方案?有人帮忙吗?

3 个答案:

答案 0 :(得分:1)

Object.values(obj);

其中obj =您的数据

答案 1 :(得分:1)

您应该使用row_to_json()json_agg和/或array_to_json()从postgres中将其作为JSON获取。请参阅有关Aggregate functions

的文档
select array_to_json(array_agg(row_to_json(t)))
from (
  select id, text from words
) t

或者,您的列表必须是字符串,因为它不是有效的JS。

`${yourQueryData}`

如果输入必须如问题中所提到的那样,那么一个字符串(比如说来自txt输入或其他内容)就是我们可以做的。

我们将在该字符串前后加上方括号。

然后,我们确定将其解析为JSON数据时无效的各个方面。

  1. 在对象之间添加逗号:}{},{
  2. 获取密钥并在其周围添加引号:user_id:"user_id":
  3. 将单引号替换为双引号:'Alice'变为"Alice"
  4. 您的时间戳记必须转换为字符串:2018-11-23T20:47:39.618Z"2018-11-23T20:47:39.618Z"

一旦这些问题全部解决,我们将使用JSON.parse(),您将拥有对象的JSON数组。

有很多方法可以到达那里。您可以在多个位置分割字符串,然后进行迭代并执行必要的任务。

在这里,我将使用正则表达式。为了清楚起见,每个步骤都非常明确,即使正则表达式的组也比必要的多,但我希望它可以使它更容易理解。

此答案完全基于您提供的代码。但是,如果name例如包含单引号,则需要进行一些修改。

const list = `
{ user_id: 1,
  name: 'Alice',
  created_at: 2018-11-23T20:47:39.618Z,
  count: '3' }
{ user_id: 4,
  name: 'Daphne',
  created_at: 2018-11-19T21:47:39.618Z,
  count: '3' }
{ user_id: 2,
  name: 'Bob',
  created_at: 2018-11-23T18:47:39.618Z,
  count: '2' }
{ user_id: 5,
  name: 'Evan',
  created_at: 2018-11-18T19:47:39.618Z,
  count: '2' }
{ user_id: 6,
  name: 'Fabia',
  created_at: 2018-11-22T23:47:39.618Z,
  count: '2' }
`

// Add brackets around the list to have the string representation of an array
const array = `[${list}]` // wrap into array

// 1. Add commas between objects: `}{` to `},{`
const regex = /\}[\r\n|\r|\n]?\{/gm // match closing followed by opening bracket 
const fixObjects = array.replace(regex, "},\n{") // add comma at the end of each object

// 2. Get the keys and add quotes around them: `user_id:` to `"user_id":`
const keysReg = /^(?:[\s|\{]+)([\w]+)(?:\:)/gm // get keys
const fixKeys = fixObjects.replace(keysReg, function(match, g1) { return match.replace(g1, `"${g1}"`) }); // wrap keys in quotes

// 3. Replace single quotes by double quotes: `'Alice'` becomes `"Alice"`
const quotesReg = /'(.*)'/gm // match between single quotes
const fixQuotes = fixKeys.replace(quotesReg, function(match, g1) { return `"${g1}"` })

// 4. Your timestamps must be converted to strings: `2018-11-23T20:47:39.618Z` to `"2018-11-23T20:47:39.618Z"`
const datesReg = /(\d{4})\-(\d{2})\-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d{3})Z/gm // timestamps as strings
const fixDates = fixQuotes.replace(datesReg, function(match) { return `"${match}"` } )

console.log(JSON.parse(fixDates))

答案 2 :(得分:0)

尝试一下。

objectsArray = Array.from( ObjectsList );