[英]Javascript Deep Copy Squel Object
我正在使用Nodejs嘗試對由名為Squel的查詢構建庫創建的對象進行深層復制。 但是,問題本身是如何對filteredQuery
變量進行精確復制。
該對象是通過以下方式創建的: filteredQuery = squel.select()
對象的console.log在下面可用。 它看起來像一個Javascript對象,其前面帶有“ _class42”字符串。
我如何制作filteredQuery
變量的深層副本?
注意:我嘗試過filteredQuery2 = JSON.parse(JSON.stringify(filteredQuery));
但是,它返回對象本身,但不返回其前面的“ _class42”字符串
npm lodash,clone和deepcopy模塊也使指針不是該對象的副本。
console.log(filteredQuery)
:
_class42 {
options:
{ autoQuoteTableNames: false,
autoQuoteFieldNames: false,
autoQuoteAliasNames: false,
useAsForTableAliasNames: false,
nameQuoteCharacter: '`',
tableAliasQuoteCharacter: '`',
fieldAliasQuoteCharacter: '"',
valueHandlers: [],
parameterCharacter: '?',
numberedParameters: false,
numberedParametersPrefix: '@',
numberedParametersStartAt: 1,
replaceSingleQuotes: true,
singleQuoteReplacement: '\'\'',
separator: ' ',
stringFormatter: null,
rawNesting: false },
blocks:
[ _class6 { options: [Object], _str: 'SELECT' },
_class18 { options: [Object] },
_class37 {
options: [Object],
_parent: [_class34],
top: [Function: _limit] },
_class13 { options: [Object], _fields: [] },
_class11 { options: [Object], _tables: [] },
_class27 { options: [Object], _joins: [] },
_class24 { options: [Object], _conditions: [Array] },
_class19 { options: [Object], _groups: [] },
_class26 { options: [Object], _orders: [] },
_class38 { options: [Object], _parent: [_class34] },
_class36 {
options: [Object],
_parent: [_class34],
limit: [Function: _limit] },
_class28 { options: [Object], _unions: [] } ],
distinct: [Function],
top: [Function],
fields: [Function],
field: [Function],
from: [Function],
join: [Function],
left_join: [Function],
right_join: [Function],
outer_join: [Function],
left_outer_join: [Function],
full_join: [Function],
cross_join: [Function],
where: [Function],
group: [Function],
order: [Function],
offset: [Function],
limit: [Function],
union: [Function],
union_all: [Function] }
不久前我想做類似的事情,卻偶然發現了...
function deepCopy(obj) {
if (Object.prototype.toString.call(obj) === '[object Array]') {
var out = [], i = 0, len = obj.length;
for ( ; i < len; i++ ) {
out[i] = arguments.callee(obj[i]);
}
return out;
}
if (typeof obj === 'object') {
var out = {}, i;
for ( i in obj ) {
out[i] = arguments.callee(obj[i]);
}
return out;
}
return obj;
}
}
我不得不承認,我記不清消息來源,因此不能贊揚。 但是,快速搜索會產生大量結果。 例如,此中篇文章 。 這也為復制對象提供了一些非常好的示例和解釋。
我喜歡使用此克隆功能
const clone = obj =>
Array.isArray(obj)
? obj.map(item => clone(item))
: obj instanceof Date
? new Date(obj.getTime())
: (typeof obj === 'object') && obj
? Object.getOwnPropertyNames(obj).reduce((o, prop) => ({ ...o, [prop]: clone(obj[prop]) }), {})
: obj;
如果是數組,則返回帶有每個對象的克隆的數組;如果是日期,則返回具有相同時間的日期;如果是對象,則返回克隆了每個屬性的克隆;如果是,則僅返回項目參考或功能。 如果您具有箭頭功能方法,但對大多數對象都適用,則會跌倒。
一種解決方法是使用sql-template-strings庫而不是squel。
然后,一個簡單的lodash深層克隆即可完成工作。
const SQL = require('sql-template-strings') //instead of squel
const _ = require('lodash');
...
var query = SQL`SELECT author FROM books WHERE name = ${book} AND author = ${author}`
var query_clone = _.cloneDeep(query)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.