【问题标题】:Objection.js not proper returnObjection.js 没有正确返回
【发布时间】:2019-12-21 11:45:10
【问题描述】:

在 objection.js 中插入图后我没有得到正确的回报

我得到的结果如下:

[
  User {
    name: 'Santosh Devi',
    city: 'Suratgarh',
    number: '9898987458',
    userroles: UserRoles { role_id: 2, user_id: 37 },
    id: 37
  }
]

我想要这样的结果:

[
  {
    name: 'Santosh Devi',
    city: 'Suratgarh',
    number: '9898987458',
    userroles: { role_id: 2, user_id: 37 },
    id: 37
  }
]

【问题讨论】:

  • 您可以使用JSON.parse(JSON.stringify(result)) 将对象转换为普通对象,尽管deep clone function 也可以完成这项工作,而无需临时转换为字符串。
  • 但有人可能会问:您为什么会担心这个问题?
  • 我能知道他们两个有什么区别吗@trincot
  • 我添加了一些解释的答案。

标签: javascript express objection.js


【解决方案1】:

有几种方法可以摆脱特定的类引用:

1。 JSON.parse(JSON.stringify(result))

这将通过首先将整个对象转换为字符串(JSON 格式),然后执行相反的操作来重建对象——从字符串创建新对象。由于这种字符串格式 (JSON) 不存储自定义类信息,因此它达到了您的目的。但是,如果您的对象有函数、符号,那么这些将被省略。 MapSet 也将成为空对象。有关更完整的限制列表。见JSON.stringify

2。深度克隆

那里有几个深度克隆功能,它们可能会或可能不会达到您的预期。有些人仍会尝试维护原始原型参考,因此它不会使您受益。你可以在这里找到一些:How to Deep clone in javascript。对于您的情况,这个可以完成这项工作:

function deepClone(obj, hash = new WeakMap()) {
    if (Object(obj) !== obj) return obj; // primitives
    if (hash.has(obj)) return hash.get(obj); // cyclic reference
    const result = Array.isArray(obj) ? [] : {};
    hash.set(obj, result);
    return Object.assign(result, ...Object.keys(obj).map(
        key => ({ [key]: deepClone(obj[key], hash) }) ));
}

你称它为newResult = deepClone(result)

这里的优点是它支持循环引用,这是JSON.stringify 无法处理的。此外,没有发生字符串转换,这实际上是没有必要的。你可以扩展这个函数来处理一些你喜欢保持这种状态的类实例。了解如何在 this answer 中支持 Date、RegExp、Map、Set 等。但不要做“包罗万象”的路线。

3。更改原型

使用这种策略,您可以就地改变结果。

function removeClasses(obj, hash = new WeakSet()) {
    if (Object(obj) !== obj) return; // primitives
    if (hash.has(obj)) return; // cyclic reference
    hash.add(obj);
    if (Array.isArray(obj)) Object.setPrototypeOf(obj, Array.prototype);
    else Object.setPrototypeOf(obj, Object.prototype);
    for (let value of Object.values(obj)) {
        removeClasses(value, hash);
    }
}

将其称为removeClasses(result),之后result 将被“修复”。同样,此方法不使用到字符串的转换。由于它也不创建新对象,因此消耗的内存更少。但另一方面,你改变了一个对象,有些人会建议不要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多