用字符串代替对象代替返回数组

Jam*_*mie 9 sql-server sequelize.js

有时我只想从多行中选择一个值。

假设我有一个如下所示的帐户模型:

帐户

  • ID
  • 名称
  • 年龄

而且我只想选择名称。

您将编写如下内容:

AccountModel.findAll({
        where: {
            Age: {
                $gt : 18
            }
        },
        attributes: ['Name'],
        raw : true
    });
Run Code Online (Sandbox Code Playgroud)

但这将返回带有对象的数组。

[{Name : "Sample 1"}, {"Name" : "Sample 2"}]
Run Code Online (Sandbox Code Playgroud)

我想得到一个只有这样名称的数组:

["Sample 1", "Sample 2"]
Run Code Online (Sandbox Code Playgroud)

使用Sequelize是否可以实现这一目标?我在文档中搜索过,但是找不到。

Fáb*_*uza 8

2020年解决方案

大家好,您可以轻松地执行纯“拔除”方法:

const someVariable = [
  ... ( await AccountModel.findAll({
    where: {
        Age: {
            $gt : 18
        }
    },
    attributes: ['Name'],
    raw : true
  })),
].map(account => account.Name);
Run Code Online (Sandbox Code Playgroud)


cfo*_*erg 7

使用Sequelize 3.13.0,似乎不可能find返回一个平面值数组而不是对象数组。

解决问题的一种方法是使用下划线或lodash映射结果:

AccountModel.findAll({
    where: {
        Age: {
            $gt : 18
        }
    },
    attributes: ['Name'],
    raw : true
})
.then(function(accounts) {
  return _.map(accounts, function(account) { return account.Name; })
})
Run Code Online (Sandbox Code Playgroud)

我上传了一个脚本,在这里演示了这一点

快速说明,设置raw: true使Sequelize查找方法返回普通的旧JavaScript对象(即,没有Instance方法或元数据)。这对于性能而言可能很重要,但在转换为JSON之后不会更改返回的值。这是因为Instance :: toJSON始终返回纯JavaScript对象(没有Instance方法或元数据)。


Thi*_*ven 6

这是使用lambda表达式的cfogelberg答案的一个不错的ES6版本(Array.prototype.map()仅在IE9 +和lambda(箭头)函数中有效,不支持IE):

AccountModel.findAll({
    where: {
        Age: {
            $gt : 18
        }
    },
    attributes: ['Name'],
    raw : true
})
.then(accounts => accounts.map(account => account.Name));
Run Code Online (Sandbox Code Playgroud)

片段(不适用于ie):

这是我用于概念验证的一段摘要。如果不起作用,则说明您使用的是上述不受支持的浏览器之一(无论如何,您都不应直接从浏览器进行数据库调用):

AccountModel.findAll({
    where: {
        Age: {
            $gt : 18
        }
    },
    attributes: ['Name'],
    raw : true
})
.then(accounts => accounts.map(account => account.Name));
Run Code Online (Sandbox Code Playgroud)