set methods for underscore

_.override(a, b[, c...]) overrides an existing properties of object a with ones from object b _.minus(a, b[, c...]) deletes properties of object a which defined in object b _.intersect(a, b[, c...]) creates new object with properties from object a which also exists in object b

by dkunin

JavaScript

var slice = Array.prototype.slice;

  _.override = function(obj) {
    _.each(slice.call(arguments, 1), function(source) {
      if (source) {
        for (var prop in source) {
          if (obj[prop] !== void 0) obj[prop] = source[prop];
        }
      }
    });
    return obj;
  };

  _.minus = function(obj) {
    _.each(slice.call(arguments, 1), function(source) {
      if (source) {
        for (var prop in source) {
          if (obj[prop] !== void 0) delete obj[prop];
        }
      }
    });
    return obj;
  };
  
  _.intersect = function(obj) {
    var res = {};
    _.each(slice.call(arguments, 1), function(source) {
      if (source) {
        for (var prop in source) {
          if (obj[prop] !== void 0) res[prop] = obj[prop];
        }
      }
    });
    return res;
  }
  

(function() {
    var g = 'g', r = 'r', rr = {b1: r, b2: r, b3: r, c1: r, c2: r, c3: r},
        gg = {a0: g, a1: g, b0: g, b1: g, c0: g, c1: g, d0: g, d1: g};
        test = _.override(gg, rr).toSource() === ({a0:"g", a1:"g", b0:"g", b1:"r", c0:"g", c1:"r", d0:"g", d1:"g"}).toSource();
    console.log('test override:\t'+test);
})();

(function() {
    var g = 'g', r = 'r', rr = {b1: r, b2: r, b3: r, c1: r, c2: r, c3: r},
        gg = {a0: g, a1: g, b0: g, b1: g, c0: g, c1: g, d0: g, d1: g};
        test = _.minus(gg, rr).toSource() === ({a0:"g", a1:"g", b0:"g", c0:"g", d0:"g", d1:"g"}).toSource();
    console.log('test minus:\t'+test);
})();

(function() {
    var g = 'g', r = 'r', rr = {b1: r, b2: r, b3: r, c1: r, c2: r, c3: r},
        gg = {a0: g, a1: g, b0: g, b1: g, c0: g, c1: g, d0: g, d1: g},
        test = _.intersect(gg, rr).toSource() === ({b1:"g", c1:"g"}).toSource();
    console.log('test intersect:\t'+test);
})();