簡體   English   中英

Javascript Deep Copy Squel對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM