You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							43 lines
						
					
					
						
							1.4 KiB
						
					
					
				
			
		
		
	
	
							43 lines
						
					
					
						
							1.4 KiB
						
					
					
				var _setup = require('./_setup.js');
 | 
						|
var isFunction = require('./isFunction.js');
 | 
						|
var _has = require('./_has.js');
 | 
						|
 | 
						|
// Internal helper to create a simple lookup structure.
 | 
						|
// `collectNonEnumProps` used to depend on `_.contains`, but this led to
 | 
						|
// circular imports. `emulatedSet` is a one-off solution that only works for
 | 
						|
// arrays of strings.
 | 
						|
function emulatedSet(keys) {
 | 
						|
  var hash = {};
 | 
						|
  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
 | 
						|
  return {
 | 
						|
    contains: function(key) { return hash[key] === true; },
 | 
						|
    push: function(key) {
 | 
						|
      hash[key] = true;
 | 
						|
      return keys.push(key);
 | 
						|
    }
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
 | 
						|
// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
 | 
						|
// needed.
 | 
						|
function collectNonEnumProps(obj, keys) {
 | 
						|
  keys = emulatedSet(keys);
 | 
						|
  var nonEnumIdx = _setup.nonEnumerableProps.length;
 | 
						|
  var constructor = obj.constructor;
 | 
						|
  var proto = (isFunction(constructor) && constructor.prototype) || _setup.ObjProto;
 | 
						|
 | 
						|
  // Constructor is a special case.
 | 
						|
  var prop = 'constructor';
 | 
						|
  if (_has(obj, prop) && !keys.contains(prop)) keys.push(prop);
 | 
						|
 | 
						|
  while (nonEnumIdx--) {
 | 
						|
    prop = _setup.nonEnumerableProps[nonEnumIdx];
 | 
						|
    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
 | 
						|
      keys.push(prop);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = collectNonEnumProps;
 |