移动和删除 Sequelize 查询返回的 JS 对象中的键?

Moving and deleting keys in JS object returned by Sequelize query?

我有一个数据库查询 returns 我有一个格式如下的数组:

[
    { score: 1, User: { username: 'user111' } },
    { score: 2, User: { username: 'user222' } }
]

我想将每个分数的 User.username 移至用户名。这是我正在做的事情:

        console.log(JSON.parse(JSON.stringify(scores)));
        for (var i = 0, len = scores.length; i < len; i++) {
            scores[i].username = scores[i].User.username;
            delete scores[i].User;
        }
        console.log("------------------");
        console.log(JSON.parse(JSON.stringify(scores)));

不幸的是,这似乎不起作用,不知道为什么:

好的,对于那些可能偶然发现这个的感兴趣的人:

正如我所说,我从 Seqelize ORM 获得的分数作为数据库结果。这显然不是一个简单的 Javascript 对象,所以对于每个分数我都必须做这个技巧:

scores[i] = JSON.parse(JSON.stringify(scores[i]));

编辑:

Sequelize 从查询返回的对象也包含模型的所有内部信息。要使用性能更友好的方法摆脱它,请使用 get with plain: true 选项(Sequelize 3.x)。这是完整的解决方案:

        for (var i = 0, len = scores.length; i < len; i++) {
            scores[i] = scores[i].get({ plain: true });
            scores[i].username = scores[i].User.username;
            delete scores[i].User;
        }

我建议您将需要的内容复制到新对象中:

const keys = Object.keys(scores[0]).filter(key => key != 'User');
scores = scores.map(score => {
  const res = {};
  keys.forEach(key => {
    res[key] = score[key];
  });
  res.username = score.User.username;
  return res;
});

这假设所有分数都具有相同的键,但性能应该不会那么差。它的 O(n*m) 其中 n 是数组中的项目数,m 是您要复制的键数。

scores[i].User = undefined

这将清除您的数据。