mirror of
https://github.com/flynx/types.js.git
synced 2025-10-28 10:00:08 +00:00
102 lines
2.7 KiB
JavaScript
102 lines
2.7 KiB
JavaScript
/**********************************************************************
|
|
*
|
|
*
|
|
*
|
|
* XXX shoule we add these from object to Object?
|
|
* - .parent(..)
|
|
* - .parentProperty(..)
|
|
* - .parentCall(..)
|
|
* - .parentOf(..)
|
|
* - .childOf(..)
|
|
* - .related(..)
|
|
*
|
|
**********************************************/ /* c8 ignore next 2 */
|
|
((typeof define)[0]=='u'?function(f){module.exports=f(require)}:define)
|
|
(function(require){ var module={} // make module AMD/node compatible...
|
|
/*********************************************************************/
|
|
|
|
require('object-run')
|
|
var object = require('ig-object')
|
|
|
|
|
|
|
|
/*********************************************************************/
|
|
|
|
var ObjectMixin =
|
|
module.ObjectMixin =
|
|
object.Mixin('ObjectMixin', 'soft', {
|
|
// stuff from object.js...
|
|
deepKeys: object.deepKeys,
|
|
|
|
match: object.match,
|
|
matchPartial: object.matchPartial,
|
|
|
|
/* XXX not yet sure about these...
|
|
// XXX EXPERIMENTAL...
|
|
parent : object.parent,
|
|
parentProperty: object.parentProperty,
|
|
parentCall: object.parentCall,
|
|
|
|
parentOf: object.parentOf,
|
|
childOf: object.childOf,
|
|
related: object.related,
|
|
//*/
|
|
|
|
|
|
// Make a copy of an object...
|
|
//
|
|
// This will:
|
|
// - create a new object linked to the same prototype chain as obj
|
|
// - copy obj own state
|
|
//
|
|
// NOTE: this will copy prop values and not props...
|
|
copy: function(obj, constructor){
|
|
return Object.assign(
|
|
constructor == null ?
|
|
Object.create(obj.__proto__)
|
|
: constructor(),
|
|
obj) },
|
|
|
|
// Make a full key set copy of an object...
|
|
//
|
|
// NOTE: this will copy prop values and not props...
|
|
// NOTE: this will not deep-copy the values...
|
|
flatCopy: function(obj, constructor){
|
|
return Object.deepKeys(obj)
|
|
.reduce(
|
|
function(res, key){
|
|
res[key] = obj[key]
|
|
return res },
|
|
constructor == null ?
|
|
//Object.create(obj.__proto__)
|
|
{}
|
|
: constructor()) },
|
|
|
|
// XXX for some reason neumric keys do not respect order...
|
|
// to reproduce:
|
|
// Object.keys({a:0, x:1, 10:2, 0:3, z:4, ' 1 ':5})
|
|
// // -> ["0", "10", "a", "x", "z", " 1 "]
|
|
// ...this is the same across Chrome and Firefox...
|
|
sort: function(obj, keys){
|
|
keys = (typeof(keys) == 'function'
|
|
|| keys === undefined) ?
|
|
[...Object.keys(obj)].sort(keys)
|
|
: keys
|
|
new Set([...keys, ...Object.keys(obj)])
|
|
.forEach(function(k){
|
|
if(k in obj){
|
|
var v = Object.getOwnPropertyDescriptor(obj, k)
|
|
delete obj[k]
|
|
Object.defineProperty(obj, k, v) } })
|
|
return obj },
|
|
})
|
|
|
|
|
|
ObjectMixin(Object)
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
* vim:set ts=4 sw=4 : */ return module })
|