使用字符串而不是对象来定义返回数组

时间:2015-11-06 21:39:49

标签: sql-server sequelize.js

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

假设我有一个类似这样的帐户模型:

帐户

  • 编号
  • 名称
  • 年龄

我只想选择名字。

你会写这样的东西:

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

但是这会在带有对象的数组中返回。

[{Name : "Sample 1"}, {"Name" : "Sample 2"}]

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

["Sample 1", "Sample 2"]

Sequelize可以实现这一目标吗? 我通过文档搜索但找不到它。

4 个答案:

答案 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);