SQL Server 使用字符串而不是对象对返回数组进行序列化

2nc8po8w  于 2022-11-21  发布在  其他
关注(0)|答案(4)|浏览(133)

有时我只想从多行中选择一个值。
假设我有一个客户模型,如下所示:

账户

  • 识别码
  • 名称名称名称
  • 年龄

我只想选择名字。
你可以这样写:

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

但这会在具有对象的数组中传回。

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

我想得到一个只有名字的数组,如下所示:

["Sample 1", "Sample 2"]

有没有可能用Sequelize实现这个功能?我已经搜索了文档,但是没有找到。

ffscu2ro

ffscu2ro1#

使用Sequelize 3.13.0,似乎不可能让find返回一个平面值数组,而不是一个对象数组。
解决此问题的一种方法是使用下划线或长破折号Map结果:

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 find方法返回普通的旧JavaScript对象(即没有Instance方法或元数据)。这对性能可能很重要,但不会改变转换为JSON后的返回值。这是因为Instance::toJSON总是返回普通的JavaScript对象(没有Instance方法或元数据)。

q5lcpyga

q5lcpyga2#

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

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

代码段(在ie中不起作用):

下面是我用来证明概念的一个小片段。如果它不起作用,你使用的是上面提到的不受支持的浏览器之一(无论如何,你不应该直接从浏览器进行db调用):

const objArray=[{key:1},{key:2},{key:3}];
console.log("Not IE friendly:");
console.log(objArray.map(obj => obj.key));
console.log("IE friendly (might even be ES3 if you change \"let\" to \"var\"):");
let names = [];
for(let i=0 ; i<objArray.length ; i++){
    names[i] = objArray[i].key
}
console.log(names)
zbq4xfa0

zbq4xfa03#

2020年解决方案

嗨乡亲们,你们可以轻松地做你们纯粹的“采摘”法:

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

zmeyuzjn4#

arr-pluck工作正常:

var pluck = require('arr-pluck');

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

相关问题