ツイートできるJavaScriptのDeepClone

こんにちは



誰かが興味を持っているかどうかはわかりませんが、今日は140バイトに詰め込まれたDeepCloneという奇跡を作りました。

すでにこれを行って断食している場合は、鼻を突いてください。 ツイート形式では浅いコピーしか見つかりませんでした。 まあ、私は適用されたハックが禁止されたのリストに載っていることを除外しません、そして怖い車はその使用に依存しています:)



欠点のうち、jQueryのextend関数を使用した複製と同じです。ブール、文字列、日付型の標準オブジェクトを食べず、プロトタイプとコンストラクタを無視し、リングにハングアップします。

尊厳は1つであり、ほとんどの場合、純粋に美的である-サイズ。



Firefox、Chromium、Opera、IE8、およびデフォルトのAndroidブラウザでテスト済み。



カットの下-コードとそれがどのように機能するかについての短い物語。







まず、読みやすいバージョン(140バイトが圧縮されていないためdupと呼ばれます):

function dup(o) { // "string", number, boolean if(typeof(o) != "object") { return o; } // null if(!o) { return o; // null } var r = (o instanceof Array) ? [] : {}; for(var i in o) { if(o.hasOwnProperty(i)) { r[i] = dup(o[i]); } } return r; }
      
      







ここで何が起こっていますか:



オブジェクトが単純(文字列、数値、ブール値)の場合、それを返すだけで、オブジェクトがnullでないことを確認します(typeof(null)も==“ object”)。 次に、結果(配列またはオブジェクト)を作成し、プロパティを実行して、再帰的に複製します。



一般的に、すべては簡単です。 これで、ほぼ300バイトを2回圧縮する必要があります。



私たちは私たちを助けるいくつかのことを思い出します:

-typeofは演算子であり、括弧は必要ありません。

-y ?:優先度が最も低いため、左側の括弧は省略できます。

-null && {}はnull、obj && {}はobj;

-for(nullのvar i)は、1回の反復を行わずにエラーなしでパスします。

-関数のパラメーターも変数ですが、それらをすべて転送することは完全にオプションです。 これにより、varという単語の4バイトをスペースで節約できます。



これに基づいて、以下を取得します。

 function dup(o,i,r) { if(typeof o != "object") return o; r = o instanceof Array ? [] : o&&{}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); return r }
      
      







まあ、または1行(139文字)で:

 function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i]);return r}
      
      





許容サイズを150文字に増やした場合は、リンクの処理を自分自身に追加することもできます(もちろん、リングを完全に破壊するのではなく、少なくとも何か):

 r[i] = (o[i] === o) ? r : dup(o[i]);
      
      





または:

 function dup(o,i,r){if(typeof o!="object")return o;r=o instanceof Array?[]:o&&{};for(i in o)if(o.hasOwnProperty(i))r[i]=o[i]===o?r:dup(o[i]);return r}
      
      







デモ: pastehtml.com/view/buikhdvfe.htmlpastehtmlからラッパーなしで表示するには、リンクの単語「view」を「raw」に置き換えます)



UPD:

TheShockのおかげで、機能はまだ少し薄くなっています!

オプションは次のとおりです。

 function dup(o,i,r) { r=o; if(r && typeof o == "object") { r = o instanceof Array ? [] : {}; for(i in o) if(o.hasOwnProperty(i)) r[i] = dup(o[i]); } return r } // 135 function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r} //   ie8, 133 : function dup(o,i,r){r=o;if(r&&typeof o=="object"){r=Array.isArray(o)?[]:{};for(i in o)if(o.hasOwnProperty(i))r[i]=dup(o[i])}return r}
      
      





また、次の場合を排除して、別のバイトを保存する方法に関するmark_ablovからの追加の提案がありました。

 o.hasOwnProperty(i)?r[i]=dup(o[i]):1
      
      







UPD 2:

そして、このアイデアの最終的な開発は、再びTheShockからです

 function c(o,i,r){if(o&&typeof o=="object"){r=o instanceof Array?[]:{};for(i in o)o.hasOwnProperty(i)?r[i]=o[i]===o?r:c(o[i]):0}return r||o}
      
      





正確に140バイトの純粋なwin'aで、IE8で動作し、リングの最小チェックを行います!

ほら、仲間!



要点: gist.github.com/2369704

更新されたデモ: pastehtml.com/view/buiv8lzka.html



UPD 3.4:究極の武器

実際の使用のために、私はツイートに収まらない(穏やかに)別のバージョンを作成しましたが、日付とオブジェクトラッパーで動作し、ループと内部リンクも完全に解決します。 単一行バージョンは328バイトかかります。

また、マルチフレームとインスタンスの問題を完全に忘れてしまったので、私は珍しいエキセントリックだと気づきました。 さて、戦闘版では、これも現在決定されています。

ここの要点: gist.github.com/0d3e6ce689e76105f3ef

デモはこちら: pastehtml.com/view/bumpwvs4q.html



All Articles