11

次の JavaScript オブジェクトを用意しましょう。今、私はそれを複製したいのですが、いくつかのフィールドがありません。たとえば、フィールド"lastName""cars.age"
入力のない複製されたオブジェクトが必要です

{
   "firstName":"Fred",
   "lastName":"McDonald",
      "cars":[
           {
              "type":"mersedes",
              "age":5
           },
           {
              "model":"bmw",
              "age":10
           }
       ]
}  

出力(複製)

{
   "firstName":"Fred",
   "cars":[
       {
          "model":"mersedes"
       },
       {
          "model":"bmw"
       }
   ]
}   

私は次のようなことができます

var human = myJson   
var clone = $.extend(true, {}, human)  
delete clone.lastName  
_.each(clone.cars, function(car))  
{  
   delete car.age  
}  

もっと簡単な解決策を知っていますか?

4

2 に答える 2

6

オブジェクト プロトタイプへの追加を気にしない場合、これは簡単な解決策です。自分で使用するために、一部を変更することもできます。

Object.prototype.deepOmit = function(blackList) {
  if (!_.isArray(blackList)) { 
    throw new Error("deepOmit(): argument must be an Array");
  }

  var copy = _.omit(this, blackList);
  _.each(blackList, function(arg) {
    if (_.contains(arg, '.')) {
      var key  = _.first(arg.split('.'));
      var last = arg.split('.').slice(1);
      copy[key] = copy[key].deepOmit(last);
    }
  });
  return copy;
};

Array.prototype.deepOmit = function(blackList) {
  if (!_.isArray(blackList)) { 
    throw new Error("deepOmit(): argument must be an Array");
  }

  return _.map(this, function(item) {
    return item.deepOmit(blackList);
  });
};

次に、次のようなオブジェクトがある場合:

var personThatOwnsCars = {
   "firstName":"Fred",
   "lastName":"McDonald",
      "cars":[
           {
              "type":"mersedes",
              "age":5
           },
           {
              "model":"bmw",
              "age":10
           }
       ]
};

こんな魔法ができます。

personThatOwnsCars.deepOmit(["firstName", "cars.age"]);

または、このような魔法も!

[person1, person2].deepOmit(["firstName", "cars.age"]);
于 2013-01-15T22:41:55.437 に答える