vlad-74
12/24/2019 - 9:43 AM

JS РАБОТА С ОБЪЕКТАМИ

JS РАБОТА С ОБЪЕКТАМИ

const object = {one: '1️⃣', two: '2️⃣'};
Object.keys(object).length; // 2
const food = { beef: '🥩', bacon: '🥓' }
{ ...food }; // "Spread"
Object.assign({}, food); // "Object.assign"
JSON.parse(JSON.stringify(food)); // "JSON"

function deepExtend(destination, source) {
    destination = destination || {};
    for (var property in source) {
        if (source[property] && source[property].constructor && source[property].constructor === Object) {
            destination[property] = destination[property] || {};
            deepExtend(destination[property], source[property]);
        } else {
            destination[property] = source[property];
        }
    }
    return destination;
}

function clone(object) {
    return deepExtend({}, object);
}
const zoo = {lion: '🦁', panda: '🐼'};
Object.keys(zoo); // ['lion', 'panda']
Object.values(zoo); // ['🦁', '🐼']
Object.entries(zoo); // [ ['lion', '🦁'], ['panda', '🐼'] ]
/*Пример Создание нового объекта, наследующего прототип
*inherit() возвращает вновь созданный объект, наследующий свойства объекта-прототипа p. 
*Использует функцию Object.create() из ECMAScript 5, если она определена, 
*иначе используется более старый прием.*/
exports.inherit = function(p) {
	if (p == null) throw TypeError(); // p не может быть значением null
	if (Object.create) // Если Object.create() определена...
	return Object.create(p); // использовать ее.
	var t = typeof p; // Иначе выяснить тип и проверить его
	if (t !== "object" && t !== "function") throw TypeError();
	function f() {}; // Определить фиктивный конструктор.
	f.prototype = p; // Записать в его свойство prototype ссылку на объект p.
	return new f(); // Использовать f() для создания наследника" объекта p.
};

/*Копирует перечислимые свойства из объекта p в объект o и возвращает o.
* Если o и p имеют свойства с одинаковыми именами, значение свойства
* в объекте o затирается значением свойства из объекта p.
* Эта функция не учитывает наличие методов доступа и не копирует атрибуты.*/
let extend = function(o, p) {
	for(prop in p) { // Для всех свойств в p.
	o[prop] = p[prop]; // Добавить свойство в o.
	}
	return o;
};
exports.extend = extend;
/*Копирует перечислимые свойства из объекта p в объект o и возвращает o.
* Если o и p имеют свойства с одинаковыми именами, значение свойства
* в объекте o остается неизменным.
* Эта функция не учитывает наличие методов доступа и не копирует атрибуты.*/
exports.merge = function(o, p) {
	for(prop in p) { // Для всех свойств в p.
		if (o.hasOwnProperty[prop]) continue; // Кроме имеющихся в o.
		o[prop] = p[prop]; // Добавить свойство в o.
	}
	return o;
};

/*Удаляет из объекта o свойства, отсутствующие в объекте p. Возвращает o.*/
let restrict = function(o, p) {
	for(prop in o) { // Для всех свойств в o
		if (!(prop in p)) delete o[prop]; // Удалить, если отсутствует в p
	}
	return o;
};
exports.restrict = restrict;
/*Удаляет из объекта o свойства, присутствующие в объекте p. Возвращает o.*/
exports.subtract = function(o, p) {
	for(prop in p) { // Для всех свойств в p
		delete o[prop]; // Удалить из o (удаление несуществующих свойств можно выполнять без опаски)
	}
	return o;
};

/*Возвращает новый объект, содержащий свойства, присутствующие хотя бы в одном
* из объектов, o или p. Если оба объекта, o и p, имеют свойства с одним
* и тем же именем, используется значение свойства из объекта p.*/
exports.union = function(o,p) { return extend(extend({},o), p); }

/*Возвращает новый объект, содержащий свойства, присутствующие сразу в обоих
* объектах, o или p. Результат чем-то напоминает пересечение o и p,
* но значения свойств объекта p отбрасываются*/
exports.intersection = function(o,p) { return restrict(extend({}, o), p); }

/* Возвращает массив имен собственных перечислимых свойств объекта o.*/
exports.keys = function(o) {
	if (typeof o !== "object") throw TypeError(); // Арг. должен быть объектом
	var result = []; // Возвращаемый массив
	for(var prop in o) { // Для всех перечислимых свойств
		if (o.hasOwnProperty(prop)) // Если это собственное свойство,
		result.push(prop); // добавить его в массив array.
	}
	return result; // Вернуть массив.
};

exports.objToString = function(obj, ndeep) {
  if(obj == null){ return String(obj); }
  switch(typeof obj){
    case "string": return '"'+obj+'"';
    case "function": return obj.name || obj.toString();
    case "object":
      var indent = Array(ndeep||1).join('\t'), isArray = Array.isArray(obj);
      return '{['[+isArray] + Object.keys(obj).map(function(key){
           return '\n\t' + indent + key + ': ' + objToString(obj[key], (ndeep||1)+1);
         }).join(',') + '\n' + indent + '}]'[+isArray];
    default: return obj.toString();
  }
};