// ES6

// Переделайте предыдущее ДЗ используя максимум возможностей ES6. Отметьте облегчение (или утяжеление) синтаксиса.

// function a(text) {
//   return alert(text);
// };

let a = (text) => {
  return alert(text);
};

// function cube(num) {
//   return num * num * num;
// }

let cube = (num) => {
  return num * num * num;
};

// function avg2(a, b) {
//   return ((a + b) / 2);
// };

let avg2 = (x, y) => {
  return ((x + y) / 2);
};

// function sum3(a = 0, b = 0, c = 0) {
//   return (a + b + c);
// };

let sum3 = (i = 0, j = 0, l = 0) => {
  return (i + j + l);
};

// function intRandom(n, m = 0) {
//   return (Math.round(Math.random() * (m - n) + n));
// };

let intRandom = (m = 0, n = 0) => {
  return (Math.round(Math.random() * (m - n) + n));
};

// function greetAll(a) {
//   for (i = 1; i < arguments.length; i++) {
//     a += ', ' + arguments[i];
//   }
//   return 'Hello, ' + a;
// };

let greetAll = (a, ...params) => {
  for (var i = 0; i < params.length; i++) {
    a += ', ' + params[i];
  }
  return 'Hello, ' + a;
};

// function sum(a = 0) {
//   for (i = 1; i < arguments.length; i++) {
//     a += arguments[i];
//   }
//   return a;
// };

let sum = (a = 0, ...params) => {
  for (var i = 0; i < params.length; i++) {
    a += params[i];
  }
  return a;
};

// sort

// Сделайте обобщенную функцию сортировки массива

// var persons = [
//   {name: "Иван", age: 17},
//   {name: "Мария", age: 35},
//   {name: "Алексей", age: 73},
//   {name: "Яков", age: 12},
// ]

// sort(persons, "age"); //сортирует по возрасту по возрастанию
// sort(persons, "name", false); //сортирует по имени по убыванию

// Функция позволяет отсортировать любой набор данных по имени поля (второй параметр). 
// Третьим параметром идет необязательный Boolean, который в случае true делает сортировку по возрастанию, 
// в случае false - по убыванию. По умолчанию (без третьего параметра) происходит сортировка по возрастанию.

var persons = [
  { name: "Иван", age: 17 },
  { name: "Мария", age: 35 },
  { name: "Алексей", age: 73 },
  { name: "Яков", age: 12 },
]

function sort(array, keys, boolean = true) {
  array.sort(function (a, b) {
    if (boolean === true) {
      if (a[keys] < b[keys]) {
        return -1;
      }
      else {
        return 1;
      }
    }
    else {
      if (a[keys] < b[keys]) {
        return 1;
      }
      else {
        return -1;
      }
    };
  });
  return array;
}

sort(persons, "age"); //сортирует по возрасту по возрастанию
sort(persons, "name", false); //сортирует по имени по убыванию

// array map

// Используя Array.map приведите все строки в массиве к числу. Элементы других типов оставьте как есть:
// ["1", {}, null, undefined, "500", 700]
// должно превратиться в
// [1, {}, null, undefined, 500, 700]

var arr = ["1", {}, null, undefined, "500", 700];

let toInt = arr.map(function (element) {
  let number = parseInt(element);
  return isNaN(number) ? element : number;
});

// array reduce

// Получите произведение всех чисел в массиве, используя Array.reduce. Не обрабатывайте типы данных, не являющиеся числом.
// ["0", 5, 3, "string", null]
// результат должен быть 15

var arr = ["0", 5, 3, "string", null];

let reduceMult = arr.reduce(function (a, b) {
  if (typeof (b) === 'number') {
    a *= b;
  };
  return a;
}, 0);

// object filter

// Напишите свою реализацию Array.filter для объектов:

// var phone = {
//     brand: "meizu",
//     model: "m2",
//     ram: 2,
//     color: "black",
// };

// filter(phone,(key,value) => key == "color" || value == 2);

// должно вернуть

// {
//     ram: 2,
//     color: "black",
// }

// Для удаления пары ключ-значение используйте delete. Или сделайте копию объекта.

var phone = {
  brand: "meizu",
  model: "m2",
  ram: 2,
  color: "black",
};

function filter(obj, search, val) {
  var objCopy = {};
  for (var key in obj) {
    if (search == key || obj[key] == val) {
      objCopy[key] = obj[key];
    };
  };
  return objCopy;
};

// object map

// Напишите свою реализацию Array.map для объектов:

// map({name: "Иван", age: 17},function(key,value){
//     var result = {};
//     result[key+"_"] = value + "$";
//     return result;
// }) 

// должен вернуть {name_: "Иван$", age_: "17$"}

var person = {
  name: "Иван",
  age: 17
};

function map(object, callback) {
  var obj = {};
  for (var key in object) {
    Object.assign(obj, callback(key, object[key]));
  };
  return obj;
};

map(person, function (key, value) {
  var result = {};
  result[key + "_"] = value + "$";
  return result;
});

// Sum

// Напишите функцию, который будет считать сумму арифметической прогрессии рекурсивно.

function progressionSum(n) {
  if (n == 1) {
    return 1;
  };
  return n + progressionSum(n - 1);
};