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 信息,因此它可以达到您的目的。但是,如果您的对象具有函数、符号,那么这些将被省略。 Map
和 Set
也将成为空对象。有关更完整的限制列表。参见 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"。同样,此方法不使用到字符串的转换。由于它也不创建新对象,因此它消耗的内存较少。但另一方面,你改变了一个对象,有些人会反对这样做。
我在 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 信息,因此它可以达到您的目的。但是,如果您的对象具有函数、符号,那么这些将被省略。 Map
和 Set
也将成为空对象。有关更完整的限制列表。参见 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"。同样,此方法不使用到字符串的转换。由于它也不创建新对象,因此它消耗的内存较少。但另一方面,你改变了一个对象,有些人会反对这样做。