如何从对象列表中检索值列表?

3

我有一个 Sequelize 查询形成的对象列表,类似于这样:

  [
  Likes {
    dataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' },
    _previousDataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' },
    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  },
  Likes {
    dataValues: { PlaceId: '417f55a6-1d64-491f-9c00-8f3094f3f53a' },
    _previousDataValues: { PlaceId: '417f55a6-1d64-491f-9c00-8f3094f3f53a' },
    _changed: Set(0) {},
    _options: {
      isNewRecord: false,
      _schema: null,
      _schemaDelimiter: '',
      raw: true,
      attributes: [Array]
    },
    isNewRecord: false
  }
]

当我查询时,我会得到以下两种列表之一,导致出现各种异常:[{PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd'},{PlaceId: 'e678yt6-c846-46b5-aa25-6534d67326au'}] 或 [].

我已经尝试了Object.values、valueOf、map和其他内置方法,甚至手动使用for循环,但我真的不明白为什么它们不起作用。你有什么解决方法建议吗?

解决方案:

return  models.Likes.findAll({
            where: {
                UserId: req.user.id
            },
            attributes: ['PlaceId']
        }).then(likes => {
            var values;
            try {
                values = likes.map(entity => entity.get('PlaceId'))
            }
            catch (e){
                console.log(e);
            }
            models.Place.findAll({
                where: {
                    id: {
                        [Sequelize.Op.notIn]: values
                    }
                },
                limit: 24
            })

这是最终的工作解决方案,感谢其中一位建议者提供的指导。使用 (entity => entity.get) 进行映射即可解决问题。向所有评论和帮助过我的人致以最好的问候。
如果有人需要,这个东西会从一个表执行 sequelize 查询,然后再查询另一个带有“NOT IN”的表。在 SQL 查询中,它看起来像这样:
"SELECT "id", "coordinates", "place_name", "description", "category", "createdAt", "updatedAt" FROM "Places" AS "Place" WHERE "Place"."id" NOT IN ('e61d2360-c846-46b5-aa25-6534d38276dd', '417f55a6-1d64-491f-9c00-8f3094f3f53a') LIMIT 24;"

@mplungjan 这是一个对象数组(已经在控制台中记录并复制,只需在示例中放置一个对象,以避免过载)。添加了一个包含两个元素的列表以澄清。 - Monika Gornostajūtė
@KooiInc 控制台已完全记录并复制 - 应该是有效的。 - Monika Gornostajūtė
@MonikaGornostajūtė 抱歉,您的示例与描述不符。 [{"placeid":"xxx"},{"placeid":"zzz"}] 是一个对象数组。这个:Likes { dataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' }, _previousDataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' } 不是。 - mplungjan
@mplungjan 对不起我误导了你,我做出了一个假设,认为如果几个东西用 [ ] 括起来(就像在示例中一样)- 它就是一个数组。我知道 Likes { dataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' }, _previousDataValues: { PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd' } 本身不是一个数组,但是多个这样的东西在一起 - 就像我想的那样。 - Monika Gornostajūtė
I get either a list like that: [{PlaceId: 'e61d2360-c846-46b5-aa25-6534d38276dd'}, {PlaceId: 'e678yt6-c846-46b5-aa25-6534d67326au'}] or an empty list: []. so I expected dataValues: [ here is an array ] - mplungjan
显示剩余3条评论
1个回答

1
我会说,这对你来说应该足够了。
const FirstTable = sequelize.model(`FirstTable`)
const list = await FirstTable.findAll({
    attributes: [`PlaceId`]
})
    .then(data => {
        return data.map(entity => entity.get('PlaceId'))
    })
console.log(list)

输出将是:

[
  'e61d2360-c846-46b5-aa25-6534d38276dd',
  'e678yt6-c846-46b5-aa25-6534d67326au'
]

非常感谢!将此应用于代码中,它起作用了。显然,没有使用“=>”表达式进行映射是我的错误。 - Monika Gornostajūtė

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