有时我只想从多行中选择一个值。
假设我有一个类似这样的帐户模型:
帐户
我只想选择名字。
你会写这样的东西:
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
});
但是这会在带有对象的数组中返回。
[{Name : "Sample 1"}, {"Name" : "Sample 2"}]
我想得到一个只有这样名字的数组:
["Sample 1", "Sample 2"]
Sequelize可以实现这一目标吗? 我通过文档搜索但找不到它。
答案 0 :(得分:5)
使用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; })
})
我上传了一个演示此here的脚本。
快速说明,设置raw: true
会使Sequelize查找方法返回普通的旧JavaScript对象(即没有实例方法或元数据)。这可能对性能很重要,但在转换为JSON后不会更改返回的值。这是因为Instance::toJSON总是返回一个普通的JavaScript对象(没有实例方法或元数据)。
答案 1 :(得分:2)
这是一个很好的ES6版本的cfogelberg使用lambda表达式的答案(Array.map
仅适用于IE9 +而lambda(箭头)函数没有IE支持):
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})
.then(accounts => accounts.map(account => account.Name));
这是我用于概念验证的婴儿代码:
let a=[{b:1},{b:2},{b:3}];
console.log(a.map(c => c.b));
答案 2 :(得分:0)
arr-pluck效果很好:
var pluck = require('arr-pluck');
AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})
.then(function(accounts) {
return pluck(accounts, 'Name');
})
答案 3 :(得分:0)
2020解决方案
嗨,伙计们,您可以轻松地进行纯粹的“采摘”方法:
const someVariable = [
... ( await AccountModel.findAll({
where: {
Age: {
$gt : 18
}
},
attributes: ['Name'],
raw : true
})),
].map(account => account.Name);