◆ 大きなデータの一部を重複ありで複数 配列で保持したい時の保持する方法
◆ 添字の番号だけを保存しなくても参照なのでメモリ的には困らなそう
  ◆ 元データ削除のときの GC とかは別の問題
◆ 添字も欲しい時以外は直接オブジェクトを配列から参照しておけばよさそう
◆ 添字で保存する場合は元のデータが変更されないようにしないとだめ
 

オブジェクトの入った大きな配列があります
↓の例では id だけですが、もっと複雑な構造でいっぱいプロパティがあって 配列の要素数も百くらいはあります

[
  {id: 1},
  {id: 2},
  {id: 3},
  {id: 4},
  {id: 5},
  ....
]

ここからユーザがいくつか選択して
[
  {id: 1},
  {id: 2}
]
だったり
[
  {id: 3},
  {id: 8},
  {id: 10}
]
だったりとなります


このときに前の状態に戻れるように選択したもののログを残したいです
var history = [
    [
        {id: 1},
        {id: 2}
    ],
    [
        {id: 1},
        {id: 3},
        {id: 4},
        {id: 5},
        {id: 9}
    ],[
        {id: 6},
        {id: 9},
        {id: 12}
    ]
]

のように形で保存しておけば復元しやすいですが オブジェクトで履歴を毎選択ごとに持っていたらすごくメモリとりそうで 元のデータのインデックスだけを保持するようにしてました

こんなの
var history = [
    [0, 1],
    [0, 2, 3, 4, 8],
    [5, 8, 11]
]

復元するときはインデックスを元にオブジェクトを取り出します


ですが

考えてみると オブジェクトのまま履歴に保持していてもオブジェクト自体は参照で保持されます
オブジェクトがどれだけ複雑な構造でプロパティが多くても そのオブジェクトがすでにどこかの変数から参照されているなら そこへの参照だけが保持されるだけです

詳しくは知らないですが 内部的にもオブジェクトへの参照だと数値型ひとつ分と大差ないメモリ量だと思います

余計な工夫なんてせず 直接保存しておきたいものを履歴に追加していって問題なさそうです


↓イメージ図
refimage

data の配列それぞれの矢印の先の D がそれぞれの大きなデータです
上で言うと id だけ入ってるオブジェクトです

青色の四角のところに何を入れようかというのが今回の問題点です
オブジェクトを保存したときに入ってるのは 矢印だけです
矢印の先のデータはすでにあるので 矢印を作ったからといってメモリはとられないです

青色の四角に data の添字を数値で入れておいて D にアクセスしたくなったときに data を通してアクセスするのに比べると余分な手間も減りますし 添字の番号も保存したいという意図でもなければ直接オブジェクト保存のほうがよさそうです