Objection.js 不合适 return

Objection.js not proper return

我在 objection.js

中插入图表后 return 不正确

我得到的结果如下:

[
  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
  }
]

有几种方法可以删除特定的 class 引用:

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

这将通过首先将整个对象转换为字符串(JSON 格式),然后进行相反的操作来重建对象——从字符串创建新对象。由于此字符串格式 (JSON) 不存储自定义 class 信息,因此它可以达到您的目的。但是,如果您的对象具有函数、符号,那么这些将被省略。 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 无法处理。此外,没有发生字符串转换,这实际上是没有必要的。您可以扩展此功能以继续处理您希望保持这种状态的一些 class 实例。在 this answer 中了解如何支持 Date、RegExp、Map、Set 等。但不要执行 "catch-all" 行。

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就是"fixed"。同样,此方法不使用到字符串的转换。由于它也不创建新对象,因此它消耗的内存较少。但另一方面,你改变了一个对象,有些人会反对这样做。